.NET程序集中BadImageFormatException的另一个可能原因是什么?

6
我正在使用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模式,我都会收到相同的错误,但当设置为“Any CPU”时,执行将超过该点,但执行会在稍后调用VC++库时中止,没有异常。无论是否与此问题相关,是否有任何“Any CPU”与x86和x64不同的东西可以阐明这一点?

有没有可能正在运行的应用程序可以访问 x64 版本的 VC++ 库,并尝试加载该库?或者,您正在运行的应用程序可能是针对 AnyCPU 而不是 x86 的?如果您在 64 位环境中,则 AnyCPU 将在 64 位中加载。 - Anzurio
好问题。前者似乎不是这种情况,我尝试将项目复制到另一台从未安装该库的机器上,仔细地只复制了程序集的x86版本。但是,在另一台机器上出现了同样的问题。应用程序肯定设置为x86。出于好奇心,我将其设置为“任何 CPU”运行。当我这样做时,它可以通过第一个调用VC++库(在设置为x86或x64时因此而失败),但执行在对库进行后续调用期间终止。 - Phillip Knauss
在你的.exe文件和.dll文件上运行x86依赖项查看器。我曾经在从64位机器的system32复制msvcr120.dll后遇到过这个问题。哎呀! - Jason Harrison
5个回答

4
当我遇到这个错误时,通常是由于在64位进程中加载32位DLL引起的。将EXE文件设置为编译为x86,看看是否可以解决问题。

正如我在最初的问题中所说,一切都设置为x86。 - Phillip Knauss

3

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


谢谢您的快速回复,但我们这里没有任何Visual Studio 2010安装程序,因此也没有CLR 4.0。 - Phillip Knauss

3

检查.dll加载冲突!

我正在从C#调用一个C++/CLI dll; C++/CLI库是第三方本地dll的包装器。

结果发现我有两个相同名称的dll,都在路径中(libeay32.dll)。

为了发现问题的来源,我安装了Windows调试工具: https://learn.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 . . .”文件夹中),以启用加载器“snaps”的显示

例如:

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

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

例如:

> cdb -g <my test app.exe>

重命名“错误”的libeay32.dll可以演示问题,但只是暂时的解决方案!

相同的故障排除方法可能对您也有用。


感谢 @kfreezen! - CJBrew

2

考虑到您在此处使用了本机代码,我认为最可能的问题是您试图将本机DLL加载为.NET程序集。这种情况会引发BadImageFormatException异常。

请尝试运行应用程序并将其设置为在抛出BadImageFormatException异常时中断,查看正在加载的DLL是什么。如果是本机的,则是问题所在。


0
在我的情况下,如果勾选了 EXE 项目属性的 Debug 标签中的 启用非托管代码调试,反而会出现问题。关闭它却解决了问题。
说实话,我不确定为什么这是问题的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接