当我使用
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.
DDKWidget
和DDKLibA.dll
是我的项目可执行文件和我自己创建的DLL
。
我在 DLL
中创建了我的 C++
,但我在我的 C#
项目中使用了它,使用 [DllImport("DDKLibA.dll")]
。
我的
OS
是Win7 64 bit
。IDE
是VS2008 SP1
。
有人遇到过这种情况吗?
顺便说一句,前一段时间一切都很好,但最近,自从我重新安装了我的
OS
后,我开始收到这些错误。有人可以帮我吗?
这听起来像是 64 位与 32 位不匹配的问题。默认情况下,CLR 应用程序会针对“AnyCPU”进行编译,这意味着它们将自动在 64 位操作系统上作为 64 位进程运行。
另一方面,C++ dll 必须编译为 32 位或 64 位,并且一旦编译,它们就会保持这种状态。
即使在 64 位操作系统下,您也可以强制 C# 应用程序以 32 位模式运行,但可以针对调试和发布配置独立更改该设置。
我的猜测是您的 C++ dll 被编译为 32 位,并且 C# dll 的调试设置也是 32 位,但在发布模式下它设置为 AnyCPU。这样它将作为 64 位进程运行,并且无法加载 32 位 C++ dll。
dll 位于文件系统的哪个位置?也许您将其复制到与发布 exe 相同的目录,但忘记对调试 exe 执行相同的操作?
我唯一一次看到这种情况发生是当依赖的 DLL 丢失时。例如,程序集的发布版本依赖于 foo.dll,但调试版本依赖于 foo-debug.dll。如果目标系统上未安装 foo-debug.dll,则无法加载程序集的调试版本。
我建议您使用文件监视实用程序,例如 FileMon 来查看加载 DLL 时操作系统尝试加载哪些文件。
就我而言有点不同。
在 ABC 项目中,我创建了一个 nuget 包,以便方便地包含在其他项目中。
ABC 项目和 nuget 包都是使用 .NET7 构建的,并且具有相同的调试/发布设置。
我可以运行在调试/发布模式下安装了相同 nuget 包的所有其他项目,没有任何问题,但在 ABC 项目中,它给出了一个错误,无法加载此程序集仅在调试模式下:
nuget包有以下包:
所以这让我发疯,因为正如你所看到的,无法加载的程序集甚至没有在 nuget 包和 ABC 项目中使用。
我一遍又一遍地重新检查是否有错误的配置,也尝试了上面的解决方案,但都没有解决问题。
这就是我解决问题的方法:(我使用的是 Rider 2022.3)
完成此操作后,我在调试模式下重新运行 ABC,问题就消失了。 希望它对某人有帮助。