我在XP中的Cygwin中使用Makefiles,但使用的是Visual Studio 2005命令行编译器。 unmanged代码是用C ++编写的,托管代码是Managed C ++。
我有一个项目,它创建了一堆非托管DLL和一个托管DLL。托管DLL是一个非托管DLL的包装器,它随后引用了许多其他非托管DLL。
例如, - >非托管 / 管理 - >不受管理 - >非托管 \ - >不受管理等;
我有一个托管代码测试驱动程序,它可以加载托管DLL,创建一个对象,并调用托管包装器。
所以这就是事情。只要我将所有需要的DLL保留在与测试驱动程序可执行文件相同的目录中,一切正常。但是,我需要将DLL移动到与测试驱动程序exe不同的目录。
如果我将所有内容移到另一个目录,一切都会停止工作。 (我运行test.exe时甚至没有出错,它“运行”然后返回命令行。)显然,这是一个DLL问题。
(您知道,我不能使用GAC或%PATH%以便test.exe可以找到DLL。)
所以我做了很多搜索,并尝试了各种方法来弄清楚如何让test.exe看到DLL。
我尝试了应用指定路径。没工作。后来从http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx读取“计算DLL搜索路径时不使用App Paths键。”
我用清单文件尝试了各种各样的东西。
我尝试了一些很可能无论如何都没有用的东西,但我却变得绝望了。
最近我尝试了app.config方法。
使用这最后一种方法我取得了一些成功,因为test.exe运行但在运行时死机,当test.exe尝试执行来自DLL的调用时出错。之前的任何事情都会被执行。
例如,如果我运行test.exe,它会询问用户一些信息。如果信息不好则将错误返回给用户,但如果信息正确则返回此错误:
“错误:发生ASCII解析错误:无法加载动态库[ATC15.dll]。找不到指定的模块。”
然后test.exe继续执行剩余的代码。
所以请帮助我理解如何让可执行文件“看到”所有的DLL。
答案 0 :(得分:1)
但是,我接受了他的建议并重新调查了SetDLLDirectory函数。我补充说:
#include "windows.h"
WINBASEAPI
BOOL
WINAPI
SetDllDirectoryA(
__in_opt LPCSTR lpPathName
);
#define SetDllDirectory SetDllDirectoryA
到我的代码的开头,然后调用SetDLLDirectory(“c:\ path”);然后重新编译。跑了程序,它仍然无法正常工作。
但后来我将app.config文件添加到我的目录
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="putDLLsHere"/>
<dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
这一起起作用了。
谢谢汉斯指出我正确的方向!