我正在使用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不同的东西,这可能会对此有所启发?
答案 0 :(得分:4)
当我收到此错误时,它总是由在64位进程中加载32位DLL引起的。
将EXE文件设置为编译为x86并查看它是否有效。
答案 1 :(得分:3)
您可能正在尝试在CLR 2.0上加载为CLR 4.0构建的程序集。
答案 2 :(得分: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 ...”文件夹中)以启用加载程序“snaps”的显示
即
> gflags -i <my test app.exe> +sls
然后在cdb(控制台调试器)或windbg中运行应用程序并通过输出拖动以找出导致异常的dll。
e.g。
> cdb -g <my test app.exe>
重命名'错误'libeay32.dll证明了这个问题,但这只是一个临时解决方案!
无论如何,相同的故障查找方法可能对您有用。
答案 3 :(得分:2)
鉴于您在这里使用本机代码,我认为这里最可能的问题是您尝试加载本机DLL,就像它是.Net程序集一样。这是一个会产生BadImageFormatException
的场景。
尝试运行您的应用程序并将其设置为中断BadImageFormatException
,并查看正在加载的DLL。如果它是原生的,那就是问题。
答案 4 :(得分:0)
在我的情况下,如果选中它,那么在EXE项目属性的Debug选项卡中关闭Enable unmanaged code debugging
会产生诡计。
说实话,我不知道为什么这就是问题的原因。