如何调整dynamic加载的本机DLL的%PATH%?

我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搜索顺序 。