在C#中从SetdllDirectory指定的路径加载dll文件

8
我是新手dotnet。我有一个使用DllImport加载c dll的dotnet dll。我想将所有dll放在与应用程序位置不同的文件夹中。我不想修改环境变量。因此,我使用了setdlldirectory API,并通过Assembly.Loadfrom(..)加载我的c#程序集。我检查了SetdllDirectory正常工作,验证了GetDllDirectory(..)的值。但它既没有从该文件夹加载C# dll,也没有从该文件夹加载c dll。我能够通过在Assembly.Loadfrom中指定路径来加载C# dll。但无法加载c dll。
提前致谢!
2个回答

17

我建议在运行时将目录路径添加到 PATH 环境变量中,可以使用以下代码:

var dllDirectory = @"C:/some/path";
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory);
那样做,更改仅影响正在运行的进程,并在退出时被丢弃。

实际上,我不想修改任何环境变量。是否有办法让C# dll和c# dll从SetDllDirectory指定的路径加载? - Rohit Garg
这是最简单的方法,您根本不需要使用SetDllDirectory。通过SetDllDirectory函数设置的路径在通过.NET互操作(DllImport)加载dll时将不会被使用,您必须使用LoadLibrary(kernel32.dll)来获取函数指针,然后使用封送处理从该dll中获取函数委托。这可能会有所帮助:http://stackoverflow.com/a/1750938/1515409 - Tomek
Tomek,我非常确定SetDllDirectory会影响PInvoke DLL的加载位置。 - Cameron

0

查看LoadFrom的文档,你会发现它说:如果assemblyFile存在本地映像,则不使用它。该程序集无法作为域中立加载。

我认为你需要将DLL目录添加到EXE的路径中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接