.NET 程序集中 BadImageFormatException 的替代原因?

Posted

技术标签:

【中文标题】.NET 程序集中 BadImageFormatException 的替代原因?【英文标题】:Alternate cause of BadImageFormatException in .NET Assembly? 【发布时间】:2010-03-22 17:51:49 【问题描述】:

我正在使用 C# 开发一个 .NET 3.5 控制台应用程序,它使用 VC++ 非托管 DLL。几周前我处理它时它运行没有问题,但我今天又回来了,现在得到一个 BadImageFormatException(“尝试加载格式不正确的程序。(来自 HRESULT 的异常: 0x8007000B)).

我的开发工作站运行 64 位 Windows 7,并且我使用非托管代码进行了大量工作,因此我立即检查了 .NET 程序集和 VC++ 库是否都具有 x86 目标。他们做到了。

为了确定,我清理并重建了 VC++ 库和 .NET 程序集,但无济于事。

这两个系统都没有做任何特别不寻常的事情。 VC++ 库加载一个二进制数据文件并对其内容进行一些数学处理。 .NET 程序集具有库的 DllImports 和一些用于连接它的代码。这一切都在几周前奏效了。

所以现在我想知道是否还有其他导致 BadImageFormatException 的原因比我可能遇到的 x86/x64 冲突更不常见。

谢谢。

编辑:无论 x86 或 x64 模式,我都会遇到相同的错误,但是当设置为“任何 CPU”时,执行会超过该点,但在稍后调用 VC++ 库时执行会中止,无一例外。不管这是否与这个问题有关,'Any CPU' 是否有与 x86 和 x64 不同的东西可以对此有所了解?

【问题讨论】:

正在运行的应用程序是否有机会访问 x64 版本的 VC++ 库,而它正在尝试加载该库?或者,您正在运行的应用程序可能针对的是 AnyCPU 而不是 x86?如果您在 64 位环境中,AnyCPU 将在 64 位中加载。 好问题。前者似乎不是这样,我尝试将项目复制到另一台从未有任何库副本的机器上,小心只复制 x86 版本的程序集。同样的问题发生在另一台机器上。该应用程序肯定设置为 x86。出于好奇,我将其设置为在“任何 CPU”中运行。当我这样做时,它会通过对 VC++ 库的第一次调用(设置为 x86 或 x64 时它会死掉),但在稍后调用该库时会终止执行。 在 .exe 上运行 Dependency Walker x86,然后在 .dll 上运行。在 64 位机器上从 system32 复制 msvcr120.dll 后,我遇到过这个问题。喂! 【参考方案1】:

当我收到此错误时,它总是由在 64 位进程中加载​​ 32 位 DLL 引起的。

设置EXE文件编译成x86看看能不能用。

【讨论】:

正如我在最初的问题中所说,一切都设置为 x86。【参考方案2】:

您可能正在尝试在 CLR 2.0 上加载为 CLR 4.0 构建的程序集。

【讨论】:

感谢您的快速响应,但我们这里没有任何 Visual Studio 2010 安装,所以没有 CLR 4.0。【参考方案3】:

检查 .dll 加载冲突!

我正在从 C# 调用 C++/CLI dll; C++/CLI 库是第三方原生 dll 的包装器。

原来我有两个同名的 dll,都在路径 (libeay32.dll) 中。

为了找出问题的根源,我安装了 windows 调试工具: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools 旧链接:http://www.microsoft.com/whdc/devtools/debugging/default.mspx

运行“gflags”(在“c:\Program Files\Debugging Tools ...”文件夹中)以启用加载程序“快照”的显示

> gflags -i <my test app.exe> +sls

然后在 cdb(控制台调试器)或 windbg 中运行应用程序,并在输出中搜索以找出导致异常的 dll。

例如

> cdb -g <my test app.exe>

重命名“错误”的 libeay32.dll 说明了问题,但这只是一个临时解决方案!

无论如何,同样的故障查找方法可能对你有用。

【讨论】:

感谢@kfreezen!【参考方案4】:

鉴于您在这里使用本机代码,我认为这里最可能的问题是您正试图加载本机 DLL,就好像它是一个 .Net 程序集一样。这是一种将产生BadImageFormatException 的场景。

尝试运行您的应用程序并将其设置为在抛出BadImageFormatException 时中断,然后查看正在加载的 DLL。如果是本地人,那就是问题所在。

【讨论】:

【参考方案5】:

在我的例子中,具有讽刺意味的是,在 EXE 的项目属性的“调试”选项卡中关闭 Enable unmanaged code debugging 具有讽刺意味的是,如果它被选中的话。

说实话,我不知道为什么这是问题的原因。

【讨论】:

以上是关于.NET 程序集中 BadImageFormatException 的替代原因?的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 应用程序中使用 .NET Standard 程序集中的内容文件

在 .NET Standard 程序集中从 .NET Core 和 .NET MVC/Webforms 访问连接字符串

在 .NET 程序集中内部化类和方法

为啥当控制器位于 asp.net 核心应用程序的单独程序集中时,TestServer 无法找到控制器?

如何以编程方式替换 .NET 程序集中的嵌入式资源?

ASP.NET MVC 中单独程序集中的视图