微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何为动态加载的本机dll调整%PATH%?

我正在动态加载一个.NET程序集,它依赖于几个原生的.dll串
位于各种文件夹中.但是,只有当我的应用程序启动时,它们的文件夹位于PATH环境变量中,Windows才会找到这些DLL.

我想从我的程序修改我的PATH变量,以便找到必要的库.
根据
MSDN
搜索顺序如下:……
PATH环境变量中列出的目录.“

使用了哪个PATH环境变量实例?

每个进程都有一个实例.
我尝试了Environment.SetEnvironmentvariable(“PATH”,…),但它没有帮助.
我也试过了
SetDefaultDllDirectories()
和…一起
AddDllDirectory()
但这些也没有任何区别.

症状是当%PATH%包含启动.exe时所需的文件夹时
(从CMD提示符 – 它是一个控制台应用程序),ProcessMonitor显示本机.dll在所有PATH文件夹中被探测,并最终被找到.

但是当%PATH%在启动时不包含必要的文件夹时,则仅在.exe文件夹和SYstem32中探测本机.dll(尽管%PATH%包含更多),
不管上面提到的SetEnvironmentvariable()/ SetDefaultDllDirectories()/ AddDllDirectory()调用.

这是怎么回事?我究竟做错了什么?为什么我无法有效地调整我的过程的PATH?

注意:AppDomain.AssemblyResolve事件无法帮助我,因为它在本机.dll时不会被触发
加载其他本机.dll.

解决方法:

这是因为每个进程都从生成它的进程继承其环境.并且在Microsoft的dit中没有出现像PATH这样的东西在执行过程中可能会发生变化的情况,因此CLR在进程执行期间从不刷新环境(并且不提供进程自行完成的方法).有关详情,请参见http://social.msdn.microsoft.com/Forums/vstudio/en-US/acf2d0f3-143e-4ba5-acdc-76a70a5c9830/environment-variables-refresh?forum=csharpgeneral.

由于加载器正在通过正常的Win32方式解析对非托管DLL的引用,您应该查看P /调用这些Win32函数来更改Win32 LoadLibrary()LoadLibraryEx()使用的DLL搜索顺序:

> SetDllDirectory().

将目录添加到用于查找应用程序的DLL的搜索路径.
> AddDllDirectory().

将目录添加到进程DLL搜索路径.
> SetDefaultDllDirectories().

指定调用进程加载DLL时要搜索认目录集.
> RemoveDllDirectory().

使用AddDllDirectory删除添加到进程DLL搜索路径的目录.

另见DLL Search Order.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐