C# 提供外部程序集本机dll依赖项的路径

C# 提供外部程序集本机dll依赖项的路径,c#,pinvoke,C#,Pinvoke,我有一个C#应用程序,它加载一组托管程序集。其中一个程序集加载两个本机DLL(每个位于不同位置),如果它们可用。我正在试图找到一种方法来提供这些本机DLL的搜索路径 还有其他选择吗?我真的不想在我的软件中提供这些DLL——将它们复制到程序目录当然可以解决问题 我尝试过使用setdldirectory系统函数,但使用它只能提供一条路径。每次调用此函数都会重置路径 设置PATH环境变量也不能解决问题:/将您的DLL注册到GAC。更多信息。这有助于: private void Form1_Lo

我有一个C#应用程序,它加载一组托管程序集。其中一个程序集加载两个本机DLL(每个位于不同位置),如果它们可用。我正在试图找到一种方法来提供这些本机DLL的搜索路径

还有其他选择吗?我真的不想在我的软件中提供这些DLL——将它们复制到程序目录当然可以解决问题

我尝试过使用setdldirectory系统函数,但使用它只能提供一条路径。每次调用此函数都会重置路径


设置PATH环境变量也不能解决问题:/

将您的DLL注册到GAC。更多信息。

这有助于:

    private void Form1_Load(object sender, EventArgs e)
    {
        //The AssemblyResolve event is called when the common language runtime tries to bind to the assembly and fails.
        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);
    }

    //This handler is called only when the common language runtime tries to bind to the assembly and fails.
    Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        string dllPath = Path.Combine(YourPath, new AssemblyName(args.Name).Name) + ".dll";
        return (File.Exists(dllPath))
            ? Assembly.Load(dllPath)
            : null;
    }

我知道这是一篇老文章,但这里有一个答案:使用
LoadLibary
函数,您可以强制加载本机DLL:

public static class Loader
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr LoadLibrary(string fileName);
}
您必须在调用任何其他DLL之前调用它-我通常在主程序的静态构造函数中调用它。对于
DllImport()
,我必须这样做,静态构造函数总是在加载本机DLL之前执行——它们实际上只在第一次调用导入的函数时加载

例如:

class Program
{
    static Program()
    {
       Loader.LoadLibrary("path\to\native1.dll");
       Loader.LoadLibrary("otherpath\to\native2.dll");
    }
}
加载库后,它应满足正在加载的其他托管程序集的
DllImports()
。如果没有,则可能使用其他方法加载它们,并且您可能没有其他选择,只能在本地复制它们

注意:这只是一个Windows解决方案。为了使这个更跨平台,你必须自己检测操作系统并使用适当的导入;例如:

    [DllImport("libdl")] 
    public static extern IntPtr DLOpen(string fileName, int flags);

    [DllImport("libdl.so.2")]
    public static extern IntPtr DLOpen2(string fileName, int flags);
    // (could be "libdl.so.2" also: https://github.com/mellinoe/nativelibraryloader/issues/2#issuecomment-414476716)

    // ... etc ...

此DLL是本机的,无法放入GAC。即使可能,我也不想碰它们-它们必须呆在原地。请注意,我对托管程序集没有问题,但在提供本机DLL的路径方面有问题。>我有一个C#应用程序,它加载一组托管程序集。您有权访问此程序集的源代码吗?您找到过解决方案吗?@handomecam不幸的是,没有。我通过将本机dll-s复制到我的程序目录中解决了这个问题。