故障排除BadImageFormatException

129

我有一个使用Visual Studio 2010编写的基于C#语言、针对.NET Framework 4.0的Windows服务。在调试版本下可以正常运行,但是在发布版本下遇到了System.BadImageFormatException异常(以下为详细信息)。我已经在互联网上搜索了很多解决方案,但至今没有找到合适的。

这个问题在Windows 7 64位系统和Windows XP SP3 32位系统中都存在。

以下是我尝试过的方法:

  • 验证生成设置,例如平台目标是否相同(x86)。
  • 使用带有/verbose选项的peverify确保程序集二进制文件有效。
  • 使用fuslogvw查找任何加载问题。
  • 使用CheckAsm查找缺失的文件或程序集。

所有这些检查都没有改变任何东西。我在下面附上了异常信息的全部文本,其中一些名称已更改以保护我的公司机密。

System.BadImageFormatException was unhandled
  Message=Could not load file or assembly 'XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
  Source=XxxDevicesService
  FileName=XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
  FusionLog=Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable  c:\Dev\TeamE\bin\Release\XxxDevicesService.vshost.exe
--- A detailed error log follows.
=== Pre-bind state information === LOG: User = XXX LOG: DisplayName = XxxDevices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified) LOG: Appbase = file:///c:/Dev/TeamE/bin/Release/ LOG: Initial PrivatePath = NULL Calling assembly : XxxDevicesService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. ===
日志:此绑定在默认加载上下文中开始。 日志:使用应用程序配置文件:c:\ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config 日志:使用主机配置文件: 日志:使用计算机配置文件C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config。 日志:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。 日志:尝试下载新的URL文件:///c:/TeamE/bin/Release/XxxDevices.DLL。 错误:无法完成程序集设置(hr = 0x8007000b)。探测终止。
StackTrace: 在XxxDevicesService.Program.Main(String[] args) 在System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 在System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在System.Threading.ThreadHelper.ThreadStart() InnerException:

你是否混合使用本地代码和.NET? - Keith Nicholas
1
你的想法是正确的,这个异常与x86/x64位差异有关。我猜这不是一个Web应用程序,对吗?另外,XxxDevicesService是什么类型的程序集?它是否为特定平台编译(例如32位)?如果是这样,那么你必须将你的平台编译成32位。 - Reddog
https://support.microsoft.com/en-us/kb/967163 - Palec
如果这些答案解决了您的问题,请注意使用的“WebView2Loader.dll”的版本非常重要。当我尝试在MMC Snap-Ins中使用HTMLView或FormView类型的WebView2组件时,我遇到了与“Microsoft.WebView2.FixedVersionRuntime.101.0.1210.39.x64”相同的问题。 - amirfg
我只是复制了上述的dll文件(版本1.0.1248.0,大小=157640字节)到一个适当的路径,该路径对项目可访问(您可以先将其放在项目输出文件旁边进行测试),然后WebView2浏览器开始按预期工作。微软的错误消息有时(至少在我的情况下)有点误导,并没有传达足够和到位的信息。 - amirfg
我收到了“BadImageFormatException”错误,通常发生在混合平台目标(例如,在针对x86或反之亦然的应用程序中使用在X64中编译的dll文件)或混合本机代码和.NET时,但这并不是我的问题所在。我希望这能帮助那些可能遇到类似问题的人。 - amirfg
25个回答

138

已验证的构建设置,例如平台目标都是相同的(x86)。

但崩溃日志不是这样说的:

程序集管理器加载自: C:\Windows\Microsoft.NET\Framework64

请注意名称中的64,那是64位版本框架的所在位置。在您的EXE项目上设置目标平台设置,而不是类库项目。 XxxDevicesService EXE项目决定进程的位数。


7
在你检查 EXE 项目时,要同时检查 Debug 和 Release 两个版本。 :/ - chris

65

在我不断地撞头思考整整一个星期的问题后,我分享一下对我有效的解决方法。我使用Win7 64位操作系统、32位Oracle Client,并将我的MVC 5项目设置为在x86平台上运行,因为Oracle的位数是32位。我一直收到相同的错误提示:

无法加载文件或程序集“Oracle.DataAccess”中的某一项依赖关系。尝试加载格式不正确的程序。

我重新加载了NuGet包,使用了其他应用程序中有效的DLL副本,将从属程序集的代码库设置为指向我的项目的bin文件夹,尝试了将CopyLocal设置为true或false,我试过所有方法。 最终,在我完成了足够多的工作并想要提交代码时,作为一名新承包商,我没有设置svn。在寻找将其挂钩到VS的方法时,我偶然间发现了答案。 我发现有效的方法是取消以下选项:

工具
-> 选项
--> 项目和解决方案
---> Web 项目
----> 对于网站和项目使用64位版本的 IIS Express


5
真是个救命恩人!谢谢。对我来说,我必须实际检查这个,因为我的项目实际上是x64。再次感谢!!! - viper
在这里得到了这么多的帮助后,我非常高兴能够回馈一些! - Joseph Morgan
3
对于使用本地 IIS 的用户,请确保你的应用程序池的“启用 32 位应用程序”(在高级设置下)被设置为 True - Eric Eskildsen
瞧!就是这样。 - itslittlejohn
谢谢!问题在于这不是项目级别的配置,因此每个新开发人员都会遇到相同的问题,直到我们记得勾选该框。 - vvvlad
显示剩余4条评论

29

我发现有效的方法是在“工具”=>“选项”菜单下的“项目与解决方案”=>“Web 项目”部分中勾选“使用 IIS Express 的 64 位版本用于网站和项目”的选项。


1
你是救世主。+1 - Amit Kumar
我重新安装了VS并解决了这个问题(谢谢 - 这个解决方案有效)。对我来说,故事的寓意是,如果我知道一开始没有改变任何代码,也许我应该先看看VS的配置。 - taylorswiftfan
@Lucy 检查框“为网站和项目使用64位版本的IIS Express”已禁用。 - k_kumar
请告诉露西。 - k_kumar
确实,您是救星!我的问题是在加载Mapserver的Mapscript DLL时出现了错误。没有其他方法适用于我:不改变目标平台为x86,也不将大量DLL复制到项目的Bin文件夹中。但是当我检查使IISExpress以64位运行时,它就起作用了!我不知道为什么,但它确实起作用了。接下来要在常规IIS中进行检查。 - IrfanClemson
编辑:在IIS中,我必须为应用程序池禁用32位。供参考。 - IrfanClemson

13

仅将平台目标设置为x86并不能解决我的问题。我必须在项目属性中更改位数为x86

具体操作如下:

属性 -> Web -> 位数

输入图像描述


4
在我从Visual Studio 2019切换到2022后,这对我起了作用,谢谢! - diedie2

12

当您更改了 .csproj 的目标框架并将其恢复到起始状态时,通常会发生此问题。

确保在 app.config 中的启动标记下支持 supportedRuntime version="与 cs 项目目标不同的运行时版本"。

确保检查其他自动生成的文件或可能位于 properties 文件夹中的文件,以查看这些文件与 .csproj 文件中定义的运行时版本是否不匹配。

在尝试使用项目属性解决错误之前,请务必进行以上检查,这可能会为您节省大量时间。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Krisztián Kis

10

即使我使用的是64位的Windows 7,并且正在加载64位的DLL,但我仍然遇到了同样的问题,因为在项目属性|生成中,我选择了“优先考虑32位”。(不知道为什么默认设置为这个)。一旦我取消了这个选项,一切就正常运行了。


1
一样的情况。这个方法解决了问题。引用了一个64位的程序集,活动构建配置设置为任何CPU,但由于这个“优先使用32位”的设置,假定应用程序使用32位运行,并导致了问题。 - Youp Bernoulli
在调试模式下选择了 Any CPU 而不是 x86,运行得非常顺利。 - Cardi DeMonaco Jr

8

当您的应用程序目标为.NET Framework 4.5(例如),并且您拥有以下app.config文件时,您也可能会遇到此异常:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727" />
    <supportedRuntime version="v4.0" />
  </startup>
</configuration>

当尝试启动应用程序的调试时,您会收到BadImageFormatException错误。

删除声明v2.0版本的行将清除错误。

最近我遇到了这个问题,当我尝试将目标平台从旧的.NET 2.0项目更改为.NET 4.5时。


7

背景

今天我们将WCF服务从AnyCPU切换到x64,放在运行IIS 6.2的Windows 2012 R2服务器上时,出现了以下问题。

首先,我们检查了唯一的引用程序集10次,以确保它不是x86 dll。接下来,我们多次检查应用程序池,以确保其未启用32位应用程序。

突发奇想,我尝试切换设置。结果,IIS中的应用程序池默认为“启用32位应用程序”值为假,但由于某些原因,IIS始终以x86模式运行我们的服务。

解决方案

  • 选择应用程序池。
  • 选择设置应用程序池默认值...高级设置...
  • 启用32位应用程序更改为True。
  • 单击确定
  • 再次选择设置应用程序池默认值...高级设置...
  • 启用32位应用程序更改回False。
  • 单击确定

4

我通过更改Web应用程序使用不同的“应用程序池”来解决了这个问题。


4
对于后来可能到达这里的任何人......对我来说,没有任何作用。 我的所有程序集都很好。 我在我的一个Visual Studio项目中有一个不应该存在的应用程序配置文件。 因此,请确保您需要应用程序配置文件。
我删除了额外的应用程序配置文件,然后它起作用了。

已为我解决了。我的 App.config 将 .NET 4.5.1 应用程序设置为了 2.0 CLR! - Jared Thirsk

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