调试模式下DLL加载错误,但发布模式下没问题

问题描述 投票:0回答:4

当我使用

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
后,我开始收到这些错误。有人可以帮我吗?

c# visual-studio-2008 visual-c++ windows-7 dllimport
4个回答
1
投票

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

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

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

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


0
投票

dll 位于文件系统的哪个位置?也许您将其复制到与发布 exe 相同的目录,但忘记对调试 exe 执行相同的操作?


0
投票

我唯一一次看到这种情况发生是当依赖的 DLL 丢失时。例如,程序集的发布版本依赖于 foo.dll,但调试版本依赖于 foo-debug.dll。如果目标系统上未安装 foo-debug.dll,则无法加载程序集的调试版本。

我建议您使用文件监视实用程序,例如 FileMon 来查看加载 DLL 时操作系统尝试加载哪些文件。


0
投票

就我而言有点不同。

在 ABC 项目中,我创建了一个 nuget 包,以便方便地包含在其他项目中。

ABC 项目和 nuget 包都是使用 .NET7 构建的,并且具有相同的调试/发布设置。

我可以运行在调试/发布模式下安装了相同 nuget 包的所有其他项目,没有任何问题,但在 ABC 项目中,它给出了一个错误,无法加载此程序集仅在调试模式下

  • Serilog.Formatting.Elasticsearch

nuget包有以下包:

  • Serilog.AspNetCore
  • Serilog.Enrichers.CorrelationId
  • Serilog.Enrichers.Environment
  • Serilog.Enrichers.GlobalLogContext
  • Serilog.Exceptions
  • Serilog.Sinks.Async
  • Serilog.Sinks.Console
  • Serilog.Sinks.Grafana.Loki
  • Serilog.Sinks.Http
  • 串行记录
  • Serilog.Extensions.Hosting
  • Serilog.Extensions.Logging
  • Serilog.Formatting.Compact
  • Serilog.设置.配置
  • Serilog.Sinks.调试
  • Serilog.Sinks.File
  • 还有其他一些来自 Microsoft... 和 System... 但我想它们不相关

所以这让我发疯,因为正如你所看到的,无法加载的程序集甚至没有在 nuget 包和 ABC 项目中使用。

我一遍又一遍地重新检查是否有错误的配置,也尝试了上面的解决方案,但都没有解决问题。

这就是我解决问题的方法:(我使用的是 Rider 2022.3)

  • 已删除 bin 文件夹
  • 已删除 obj 文件夹
  • Rider => 工具 => Nuget => Nuget Force Restore

完成此操作后,我在调试模式下重新运行 ABC,问题就消失了。 希望它对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.