调用函数时,非托管依赖项dll无法加载

时间:2011-02-18 17:58:17

标签: c++ unmanaged managed dll

我在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。

1 个答案:

答案 0 :(得分:1)

汉斯提出了一个很好的观点。我查看了SetDLLDirectory(忘了提及它)但我从来没有能够让它工作。我总是得到相同的结果:执行程序,什么都不会发生。

但是,我接受了他的建议并重新调查了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>

这一起起作用了。

谢谢汉斯指出我正确的方向!