如何调整动态加载的本机DLL的%PATH%?
我动态加载了一个.NET程序集,这个程序集依赖于位于不同文件夹中的几个本地.dll文件。 但是,只有在我的应用程序启动时,它们的文件夹位于PATH环境变量中,Windows才会发现这些DLL。
我想修改我的程序中的PATH变量,以便找到必要的库。 根据MSDN“搜索顺序如下:... PATH环境变量中列出的目录”。
PATH环境变量的哪个实例被使用?
每个进程都有一个实例。
我试过Environment.SetEnvironmentVariable("PATH", ...)
但它没有帮助。 我也尝试过将SetDefaultDllDirectories()与AddDllDirectory()一起使用,但这些也没有任何区别。
症状是当%PATH%
在启动我的.exe文件时(从CMD提示符 - 它是一个控制台应用程序)包含必要的文件夹时,ProcessMonitor显示在所有PATH文件夹中探测到本地.dll文件,并最终找到它们。
但是,当%PATH%
在启动时不包含必需的文件夹时,则只在.exe文件夹中和SYSTEM32中探测本地.dll(尽管%PATH%
包含更多),无论上述SetEnvironmentVariable ()/ SetDefaultDllDirectories()/ AddDllDirectory()调用。
这是怎么回事? 我究竟做错了什么? 为什么我无法有效调整流程的PATH?
注意:AppDomain.AssemblyResolve事件无法帮助我,因为当本机.dll加载其他本机.dll时它未被触发。
这是因为每个进程都从产生它的进程继承它的环境。 微软公司的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搜索顺序。
链接地址: http://www.djcxy.com/p/44581.html上一篇: How to adjust %PATH% for dynamically loaded native dlls?