我dynamic加载一个.NET程序集,这个程序集依赖于位于不同文件夹中的几个本地 .dll文件。 但是,只有在我的应用程序启动时,Windows的文件夹位于PATH环境variables中,Windows才能find这些DLL。
我想从我的程序修改我的PATHvariables,以允许find必要的库。 根据MSDN “search顺序如下:…在PATH环境variables中列出的目录”。
哪个PATH环境variables的实例被使用?
每个进程都有一个实例。
我试过Environment.SetEnvironmentVariable("PATH", ...)
但没有帮助。 我也尝试了SetDefaultDllDirectories()与AddDllDirectory(),但这些也没有任何区别。
症状是,当启动我的.exe(从CMD提示符 – 它是一个控制台应用程序) %PATH%
包含必要的文件夹时,ProcessMonitor显示本机.dll被探测到所有的PATH文件夹,并最终find。
但是当%PATH%
在启动的时候没有包含必要的文件夹时,只能在.exe文件夹和SYSTEM32中探测本地的.dll文件(尽pipe%PATH%
包含更多的文件),而不pipe上面提到的SetEnvironmentVariable ()/ SetDefaultDllDirectories()/ AddDllDirectory()调用。
这是怎么回事? 我究竟做错了什么? 为什么我无法有效地调整stream程的PATH?
注意:AppDomain.AssemblyResolve事件不能帮助我,因为在本地.dll加载其他本机.dll时它不会被触发。
那是因为每个进程都从产生它的进程继承它的环境。 而且微软公司的这种做法在执行过程中可能会改变,所以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搜索顺序 。