调试模式下DLL加载错误,但发布模式正常

时间:2012-09-18 01:55:42

标签: c# visual-studio-2008 visual-c++ windows-7 dllimport

当我使用VS2008构建项目时,我使用自己的DLL。它可以在release模式下正常工作,但当我将其更改为debug模式时,我收到错误:

An unhandled exception of type 'System.DllNotFoundException' occurred in DDKWidget.exe

其他信息Unable to load the DLL "DDKLibA.dll": The specified module could not be found.

DDKWidgetDDKLibA.dll是我的项目可摘文件和我自己创建的DLL。 我在DLL中创建了C++,但我在C#项目中使用[DllImport("DDKLibA.dll")]来使用它。

我的OSWin7 64 bit 我的IDEVS2008 SP1

之前有没有人遇到过这种情况? 顺便说一句,前段时间一切都还好,但最近,自从我重新安装OS后,我开始收到这些错误。任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:0)

文件系统中的dll位于何处?也许您将它复制到与release exe相同的目录中,但忘记对debug exe执行相同的操作?

答案 1 :(得分:0)

我发现这种情况的唯一时间是缺少依赖DLL。例如,程序集的发行版本依赖于foo.dll,但调试版本依赖于foo-debug.dll。如果目标系统上未安装foo-debug.dll,则无法加载程序集的调试版本。

我建议您使用FileMon之类的文件监控实用程序来查看操作系统在加载DLL时尝试加载的文件。

答案 2 :(得分:0)

这听起来像是64位与32位不匹配的问题。默认情况下,CLR应用程序会针对“AnyCPU”进行编译,这意味着它们将在64位操作系统上自动作为64位进程运行。

另一方面,C ++ dll必须编译为32位或64位,一旦编译,它们就会保持这种状态。

即使在64位操作系统下,您也可以强制C#应用程序以32位模式运行,但该设置可以针对调试和发布配置单独更改。

我的猜测是你的C ++ dll编译为32位,你的C#dll的Debug设置也是32位,但在Release模式下它设置为AnyCPU。这样它将作为64位进程运行,并且无法加载32位C ++ DLL。