将Target Framework更改为.net框架4后,我遇到了运行时异常:
中出现了'System.BadImageFormatException'类型的第一次机会异常使用目标框架3.5构建时,一切正常。
我正在构建的平台是x86(我发现建筑到x64晚上会导致问题)。
可能是什么问题?
答案 0 :(得分:23)
MSDN列出了可能的原因,因此我建议将其作为核对清单进行操作:
尝试加载非托管动态链接库或可执行文件(例如Windows系统DLL),就好像它是.NET Framework程序集一样。
DLL或可执行文件作为64位程序集加载,但它包含32位功能或资源。例如,它依赖于COM互操作或调用32位动态链接库中的方法。
我们的想法是确保所有项目和依赖项都被编译为针对相同的框架版本或以前的版本;并且你的每个项目在比特方面都是兼容的;如果您正在动态加载库,请务必加载它们的属性(即不要尝试将本机库作为托管程序集加载。)
或许添加一些关于项目配置/依赖关系的更多信息可以让我们更具决定性。
答案 1 :(得分:15)
确保所有解决方案中的项目构建为x86
或x64
或Any Cpu
- 任何不匹配都可能导致此问题。
同样,如果您使用的是任何第三方库,请查看其目标平台。
另一件需要考虑的事情是它是否在IIS中托管 - 在这种情况下,您必须确保程序集的位数与IIS主机进程的位数相匹配。如果您使用的是x64计算机,则可能是x64(除非已启用32位主机)。
我必须说我通常不会偏离Any CPU
,除非我对仅仅x86
或x64
的COM组件有外部依赖。它几乎总是会引起头痛。
答案 2 :(得分:7)
最有可能的是,当您为x64构建x86或x86时,其中一个程序集引用了x64程序集。
答案 3 :(得分:5)
如果您的项目第一次运行并且在更改目标框架后开始出现此错误,则还可能意味着Visual Studio在构建中进行了一些更改,并且您的某些库不再兼容。
因此,请尝试完成构建配置。
大多数情况下这会有所帮助: 转到应用程序属性>构建>勾选'首选32位'
答案 4 :(得分:3)
我今天遇到了这个问题,BadImageFormatException
只发生在我将目标框架更改为> 3.5。关于此异常的所有其他答案都在讨论我们程序集的位数(32对64)(这是一个常见问题,但并不适用于这种情况)。
如果项目在针对.NET 3.5构建时运行正常并在.NET 4.0或更高版本上抛出BadImageFormatException,那么请务必检查App.config文件以获取supportedRuntime元素。我说这个:
<supportedRuntime version="v2.0.50727" sku="Client" />
这将强制您的程序在.NET 2.0运行时上运行,该运行时无法加载.NET 4.0映像(但它可以加载.NET 3.5映像)。当切换到3.5以上的框架版本时,任何说明这一点的行都应该删除。
答案 5 :(得分:2)
如果您正在使用4.5框架,请尝试从项目属性的“调试”选项卡中取消选中“首选32位复选框”选项。
我们遇到了与4.5框架相同的问题。尝试了很多选择。最后,我们从项目属性的“调试”选项卡中取消选中“首选32位复选框”选项并运行。
答案 6 :(得分:0)
如果从dll项目开始调试时收到此错误,请确保将可执行文件和工作目录指向预期的可执行文件和工作目录。
答案 7 :(得分:0)
您必须在解决方案配置中选择调试模式而不是发布模式。
答案 8 :(得分:0)
就我而言,这是由于AppDynamics中的一个已知问题。升级版本解决了该问题。
答案 9 :(得分:0)
我最近因其他原因遇到此错误。我的与自动生成的绑定重定向有关,该重定向在.net 4.5.1及更高版本中自动启用。
“ ......您可以在项目的属性页中轻松禁用自动生成的绑定重定向。