目标框架为4.0时System.BadImageFormatException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了目标框架为4.0时System.BadImageFormatException相关的知识,希望对你有一定的参考价值。

在将Target Framework更改为.net框架4之后,我有一个运行时异常:发生了'System.BadImageFormatException'类型的第一次机会异常

使用目标框架3.5构建时,一切正常。

我正在构建的平台是x86(我发现建设到x64晚上会导致问题)。

可能是什么问题?

答案

MSDN列出了可能的原因,因此我建议将其作为清单进行操作:

  • 尝试加载非托管动态链接库或可执行文件(如Windows系统DLL),就像它是.NET Framework程序集一样。
  • DLL或可执行文件作为64位程序集加载,但它包含32位功能或资源。例如,它依赖于COM互操作或调用32位动态链接库中的方法。
  • 已使用不同版本的.NET Framework创建组件。通常,当使用.NET Framework 1.0或.NET Framework 1.1开发的应用程序或组件尝试加载使用.NET Framework 2.0 SP1或更高版本开发的程序集时,或者开发的应用程序时,会发生此异常使用.NET Framework 2.0 SP1或.NET Framework 3.5尝试加载使用.NET Framework 4开发的程序集.BadImageFormatException可能会报告为编译时错误,或者可能在运行时抛出异常。

我们的想法是确保所有项目和依赖项都被编译为针对相同的框架版本或以前的版本;并且你的每个项目在比特性方面是兼容的;如果您正在动态加载库,请确保加载它们的属性(即不要尝试将本机库作为托管程序集加载。)

也许添加一些关于项目配置/依赖关系的更多信息将使我们更具决定性。

另一答案

确保解决方案中的所有项目都构建到x86x64Any Cpu - 任何不匹配都可能导致此问题。

同样,如果您使用任何第三方库 - 也请查看他们的目标平台。

另一件需要考虑的事情是它是否在IIS中托管 - 在这种情况下,您必须确保程序集的位数与IIS托管进程的位数相匹配。如果您使用的是x64计算机,则可能是x64(除非已启用32位主机)。

我不得不说我通常不会偏离Any CPU,除非我对只有x86x64的COM组件有外部依赖。它几乎总是会引起头痛。

另一答案

最有可能的是,当您为x64构建x86或x86时,其中一个程序集引用x64程序集。

另一答案

如果您的项目第一次运行并且在更改目标框架后发生此错误,则还可能意味着Visual Studio在构建中执行了一些更改,并且您的某些库不再兼容。

因此,请尝试浏览Build配置。

大多数情况下这将有所帮助:转到应用程序属性>构建>勾选'首选32位'

另一答案

我今天遇到了这个问题,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以上的框架版本时,应该删除任何说明这一点的行。

另一答案

如果您正在使用4.5框架,请尝试取消选中项目属性的“调试”选项卡中的“首选32位复选框”选项。

我们在4.5框架中遇到了同样的问题。尝试了很多选择。最后,我们从项目属性的“调试”选项卡中取消选中“首选32位复选框”选项并运行。

另一答案

enter image description here

如果从dll项目开始调试时出现此错误,请确保将可执行文件和工作目录指向期望的可执行文件和工作目录。

另一答案

您必须在解决方案配置中选择调试模式而不是释放模式。

以上是关于目标框架为4.0时System.BadImageFormatException的主要内容,如果未能解决你的问题,请参考以下文章

将目标框架从 .NET 3.5 更改为 .NET 4.0

当项目以 3.5 为目标时,Msbuild 4.0 是不是引用 System.Core 4.0?

将项目的 .NET 目标框架从 4.0 更改为 3.5 后找不到文件(或程序集)

实体框架 6、.NET Framework 4.0 和 SaveChangesAsync

如何在部署目标 < 4.0 的项目中仅引用 iOS 4.0 枚举?

改变目标框架