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

问题描述 投票:6回答:5

我正在使用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 ++库时中止,没有异常。不管这是否与这个问题有关,是否存在“任何CPU”与x86和x64不同的东西,这可能会对此有所启发?

c# c++ visual-studio visual-studio-2008 dllimport
5个回答
4
投票

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

设置EXE文件以编译为x86并查看它是否有效。


3
投票

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


3
投票

检查.dll加载冲突!

我从C#调用C ++ / CLI dll; C ++ / CLI库是第三方本机dll的包装器。

结果我在路径(libeay32.dll)中有两个同名的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。

EG

> cdb -g <my test app.exe>

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

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


2
投票

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

尝试运行您的应用程序并将其设置为中断BadImageFormatException并查看正在加载的DLL。如果它是原生的,那就是问题所在。


0
投票

在我的情况下,在EXE的项目属性的调试选项卡中关闭Enable unmanaged code debugging讽刺地做了伎俩,如果它被检查。

说实话,我不确定为什么这就是问题的原因。

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