【发布时间】:2011-03-01 05:05:57
【问题描述】:
我想暂时在 DLL 搜索路径中添加一个目录 - 在 Windows 7 下是否有正确的方法来执行此操作?
场景
我有一个 C# 应用程序,我们称之为 WonderApp。
WonderApp 需要调用位于 C:\MyPath 的 C++ DLL。所以作为 WonderApp 的Program.Main() 的一部分,我添加了以下命令:
Environment.SetEnvironmentVariable("PATH",
"C:\\MyPath;" + Environment.GetEnvironmentVariable("PATH"));
根据this article,将目录添加到PATH 也应该将其添加到搜索DLL 的目录中。
该解决方案在 Windows XP 中运行良好:如果我将目录添加到 PATH,DLL 加载并且程序运行正常。如果我不添加目录,则 DLL 不会加载,失败并出现“未找到”错误。
但是,这不适用于 Windows 7。
所以我想,让我们尝试使用SetDllDirectory()。像这样:
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string lpPathName);
然后,以后:
bool success = SetDllDirectory(Util.Paths.GetApplicationDataDir());
success 的值为true,但 DLL 仍然无法加载。
最后,如果我在运行应用程序之前手动将PATH 设置为包含C:\MyPath - 一切正常! DLL 加载并运行良好。
所以,重新迭代:
有没有正确的方法临时在Windows 7下的DLL搜索路径中添加目录?
更新:使用 Process Explorer,我检查了应用程序的运行时环境,“C:\MyPath”确实在 PATH!此外,我看到Helper.dll 在打开的句柄列表中(作为一个 DLL,而不仅仅是一个文件)——它仍然声称找不到它。
【问题讨论】:
-
这是 64 位版本的 Windows 吗?真正的路径名是什么?
-
这是 32 位 Windows 7 家庭版。 DLL 的完整路径是 C:\MyPath\Helper.dll
-
可能缺少其他 dll 尝试在程序 "depends.exe" 中加载 helper.dll 并检查其他 dll 的依赖关系。
-
这并不能解释为什么在运行应用程序之前将目录添加到 PATH 可以让 DLL 加载。
-
嗯,...我使用的是 Win 7 x64,我也在做同样的事情(在特定目录中为 DllImport 设置 PATH)并且效果很好。