BadImageFormatException 故障排除

Posted

技术标签:

【中文标题】BadImageFormatException 故障排除【英文标题】:Troubleshooting BadImageFormatException 【发布时间】:2012-02-18 06:42:18 【问题描述】:

我有一个使用 Visual Studio 2010 用 C# 编写的 Windows 服务,目标是完整的 .NET Framework 4。当我从 Debug 版本运行时,该服务按预期运行。但是,当我从 Release 版本运行它时,我得到一个 System.BadImageFormatException(详情如下)。我一直在互联网上寻找解决方案,但到目前为止,我发现的所有东西都没有帮助我找到解决方案。

Windows 7 64 位(开发)和 Windows XP SP3 32 位(目标)系统都存在此问题。

这是我迄今为止尝试过的:

平台目标等经过验证的构建设置都相同 (x86)。 将 peverify 与 /verbose 选项一起使用以确保程序集二进制文件有效。 使用 fuslogvw 查找任何加载问题。 使用 CheckAsm 查找丢失的文件或程序集。

所有这些检查都没有改变任何东西。我已经在下面包含了异常信息的全文,其中一些名称已更改以保护我的公司主人的秘密。

System.BadImageFormatException 未处理 消息=无法加载文件或程序集“XxxDevices,版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。试图加载格式不正确的程序。 来源=XxxDevicesService 文件名=XxxDevices,版本=1.0.0.0,文化=中性,PublicKeyToken=null FusionLog=Assembly manager 加载自:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 在可执行文件 c:\Dev\TeamE\bin\Release\XxxDevicesService.vshost.exe 下运行 --- 详细的错误日志如下。 === 预绑定状态信息 === 日志:用户 = XXX 日志:DisplayName = XxxDevices,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null (完全指定) 日志:Appbase = file:///c:/Dev/TeamE/bin/Release/ 日志:初始 PrivatePath = NULL 调用程序集:XxxDevicesService,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null。 === LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:c:\TeamE\bin\Release\XxxDevicesService.vshost.exe.Config LOG:使用主机配置文件: LOG:使用 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config 中的机器配置文件。 LOG:此时未将策略应用于引用(私有、自定义、部分或基于位置的程序集绑定)。 日志:正在尝试下载新的 URL 文件:///c:/TeamE/bin/Release/XxxDevices.DLL。 ERR:无法完成程序集的设置(hr = 0x8007000b)。探测终止。 堆栈跟踪: 在 XxxDevicesService.Program.Main(String[] args) 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,字符串 [] 参数) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态) 在 System.Threading.ThreadHelper.ThreadStart() 内部异常:

【问题讨论】:

你是在混合原生代码/.net吗? 您在正确的轨道上,此异常与 x86/x64 位差异相关。我认为这不是一个网络应用程序,对吧?另外,XxxDevicesService 是什么类型的程序集?它是为特定平台编译的(例如 32 位)吗?如果是这样,那么您必须将您的平台编译为 32 位。 support.microsoft.com/en-us/kb/967163 【参考方案1】:

平台目标等经过验证的构建设置都是相同的 (x86)。

崩溃日志不是这么写的:

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

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

【讨论】:

当您检查 EXE 项目时,请同时检查 Debug Release。 ://【参考方案2】:

在我停止把头撞在桌子上思考我花了整整一周来解决这个问题之后,我正在分享对我有用的东西。我有 Win7 64 位、32 位 Oracle 客户端,并且由于 Oracle 位,我的 MVC 5 项目设置为在 x86 平台上运行。我一直收到同样的错误:

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

我重新加载了 NuGet 包,我使用了在不同应用程序中为其他人工作的 DLL 的副本,我将依赖程序集中的代码库设置为指向我的项目的 bin 文件夹,我尝试将 CopyLocal 设置为 true 或 false,我尝试了 一切。 最后,我已经完成了足够多的工作,我想检查我的代码,作为一个新的承包商,我没有设置颠覆。在寻找将其连接到 VS 的方法时,我绊倒了答案。 我发现有效的是取消选中工具=>选项菜单下的项目和解决方案 => Web 项目部分下的“使用 64 位版本的 IIS Express 用于网站和项目”选项。

【讨论】:

多么救命啊!!谢谢你。对我来说,我必须实际检查一下,因为我的项目实际上是 x64。再次感谢!!! 在我在这里获得了所有帮助之后,我很高兴能够提前支付一些费用! 对于那些使用本地 IIS 的用户,请确保您的应用程序池的“启用 32 位应用程序”(在高级设置下)设置为 True @EricEskildsen 上面关于在应用程序池中“启用 32 位应用程序”的评论的附录,即使您不想在实时环境中这样做,翻转该开关也可以提供额外的线索至于您是否面临 32 位/64 位问题或其他问题。 轰隆隆!就是这样。【参考方案3】:

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

【讨论】:

你是救世主。 +1 我重新安装了 VS 并正在解决这个问题(谢谢 - 这个解决方案有效)。对我来说,这个故事的寓意是,如果我知道我一开始没有更改任何代码,也许我应该先看看 VS 的配置。 @Lucy 复选框“为网站和项目使用 64 位版本的 IIS Express”已禁用 请告诉露西 你真是救世主!我的问题是我在加载 Mapserver 的 Mapscript DLL 时遇到了这个错误。没有其他方法对我有用:目标平台没有更改为 x86,也没有将大量 DLL 复制到项目的 Bin 文件夹中。但是当我检查使 IISExpress 以 64 位运行时,它就起作用了!我不知道为什么,但确实如此。还要检查常规 IIS..【参考方案4】:

当您更改 .csproj 的目标框架并将其恢复为您开始使用的框架时,通常会发生这种情况。

如果支持,请确保 1 运行时版本=“与 cs 项目目标不同的运行时”在 app.config 中的启动标记下。

确保 2 这也意味着检查可能是属性文件夹中的其他自动生成文件或其他文件,以查看这些文件与 .csproj 文件中定义的文件之间是否不再存在运行时不匹配。

在您开始尝试使用项目属性进行不同操作以克服错误之前,这些可能会为您节省大量时间。

【讨论】:

我遇到了类似的问题,您的回答是我的解决方案。我的 app.config 支持不同的运行时。【参考方案5】:

即使我有 64 位 Windows 7 并且我在项目属性中加载 64 位 DLL b/c,我也遇到了同样的问题 |构建我检查了“首选 32 位”。 (不知道为什么默认设置)。一旦我取消选中它,一切都运行良好

【讨论】:

这里也一样。这成功了。引用了一个 64 位程序集,并且活动构建配置设置为任何 CPU,但由于这个“首选 32 位”设置,假设使用 32 位运行应用程序并导致问题。 在 Debug 模式下选择了 Any CPU 而不是 x86,效果非常棒。【参考方案6】:

当您的应用程序以 .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】:

背景

今天,当我们在运行 IIS 6.2 的 Windows 2012 R2 服务器上将 WCF 服务从 AnyCPU 切换到 x64 时,我们开始得到这个。

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

一时兴起,我尝试切换设置。事实证明,IIS 中的应用程序池默认为 Enable 32-Bit Applications 值为 False,但 IIS 出于某种原因在我们的服务器上忽略了它,并始终以 x86 模式运行我们的服务。 p>

解决方案

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

【讨论】:

【参考方案8】:

只是将平台目标设置为 x86 并没有为我解决问题。我必须在我的项目属性中将 Bitness 更改为 x86

如下:

属性 -> 网络 -> 比特度

【讨论】:

从 Visual Studio 2019 切换到 2022 后,这对我有用,tnx! 不客气【参考方案9】:

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

【讨论】:

【参考方案10】:

对于以后可能到达这里的任何人......对我没有任何帮助。我所有的组件都很好。我的一个 Visual Studio 项目中有一个不应该存在的应用程序配置。因此,请确保需要您的应用配置文件。

我删除了额外的应用程序配置,但它起作用了。

【讨论】:

为我修复了它。我的 App.config 将我的 .NET 4.5.1 应用程序设置为 2.0 CLR!【参考方案11】:

目标构建 x64 目标服务器托管 IIS 64 位

如果应用程序构建的目标是 64 位操作系统,那么在托管 IIS 的 64 位服务器上,将运行网站/Web 应用程序的应用程序池上的启用 32 位应用程序设置为 false。

【讨论】:

【参考方案12】:

在为 32 位或 64 位平台构建应用程序时(我的经验是使用 Visual Studio 2010),不要依赖配置管理器为可执行文件设置正确的平台。即使 CM 为应用程序选择了 x86,请检查项目属性(构建选项卡):它可能仍会在此处显示“任何 CPU”。如果您在 64 位平台上运行“任何 CPU”可执行文件,它将在 64 位模式下运行并拒绝加载为 x86 平台构建的随附 DLL。

【讨论】:

【参考方案13】:

确定应用程序使用的应用程序池,并通过将启用 32 位应用程序设置为 True 来设置属性。这可以通过应用程序池的高级设置来完成。

【讨论】:

【参考方案14】:

对于可能稍后到达这里的任何人... 对于桌面解决方案,我得到了 BadImageFormatException 异常。 所有项目的构建选项都很好(全部x86)。但是解决方案的启动项目已更改为其他项目(类库项目)。

在我的情况下,将启动项目更改为原始项目(.exe 应用程序项目)是一种解决方案

【讨论】:

【参考方案15】:

在 Web.Config 中删除对 System.Runtime 的依赖,它对我有用:

<dependentAssembly>
        <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
</dependentAssembly>

【讨论】:

对我来说是System.Net.Http。谢谢。【参考方案16】:

对于 .NET Core,有一个Visual Studio 2017 bug 会导致项目属性构建页面显示不正确的平台目标。一旦发现问题所在,解决方法就很简单了。您可以将目标更改为其他值,然后再改回来。

或者,您可以将运行时标识符添加到 .csproj。如果您需要 .exe 作为 x86 运行,以便它可以加载 x86 本机 DLL,请在 PropertyGroup 中添加此元素:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

将其放在TargetFrameworkTargetFrameworks 元素之后的好地方。

【讨论】:

【参考方案17】:

我很惊讶没有其他人提到这一点,所以我分享一下,以防上述没有帮助(我的情况)。

发生的情况是 VBCSCompiler.exe 实例不知何故卡住了,实际上并未释放文件句柄以允许新实例正确写入新文件并导致问题。当我试图删除“bin”文件夹并抱怨另一个进程正在使用其中的文件时,这一点变得很明显。

关闭VS,打开任务管理器,查看并终止所有VBCSCompiler实例并删除“bin”文件夹以回到我所在的位置。

参考:https://developercommunity.visualstudio.com/content/problem/117596/vbcscompilerexe-process-stays-runing-after-exiting.html

【讨论】:

我的解决方案也是删除所有 bin 和 debug 目录。【参考方案18】:

我发生这种情况是因为某个项目的 AnyCPU 平台目标在“属性”>“构建”中设置为 x86。在那里更改它可以解决问题。

【讨论】:

【参考方案19】:

当我遇到这个问题时,以下为我解决了:

我从另一个 exe 中调用 OpenCV dll,我的 dll 不包含我的 exe 文件文件夹中已经需要的 opencv dll,如 highgui、features2d 等。我将所有这些复制到我的 exe 项目的目录中,它突然起作用了。

【讨论】:

【参考方案20】:

此错误“无法加载文件或程序集'示例'或其依赖项之一。尝试加载格式不正确的程序”通常是由不正确的应用程序池配置引起的。

    确保您的网站当前运行的 AppPool 已将“启用 32 位应用程序”设置为 False。 确保您使用的是适合您平台的正确版本。 如果您在网站上遇到此错误,请确保您的应用程序池设置为以正确的模式运行(3.0 站点应以 64 位模式运行) 您还应该确保在 Visual Studio 中对该程序集的引用指向包文件夹中的正确文件。 确保在 GAC 中为 2.0 站点安装了正确版本的 dll。 这也可能是由于 WSODLibs 与 Web 项目一起升级造成的。

【讨论】:

【参考方案21】:

对于 CI/CDMSBuildDevEnv

您的构建机器日志显示 - MSB3270 ... MSIL 与 AMD64。

warning MSB3270: There was a mismatch between the processor architecture of the project
  being built "MSIL" and the processor architecture of the reference
  "C:\build-machine\my-solution\My-1\bin\Release\My-1.dll", "AMD64".
This mismatch may cause runtime failures.
Please consider changing the targeted processor architecture of your project through
  the Configuration Manager so as to align the processor architectures between your
  project and references, or take a dependency on references with a processor architecture
  that matches the targeted processor architecture of your project. [C:\build-machine\my-solution\My-2.csproj]

您在站点的 IIS 应用程序池高级设置中将启用 32 位应用程序值设置为 True。

您的站点在部署后显示以下错误

An attempt was made to load a program with an incorrect format ... 
... BadImageFormatException

您可以通过将启用 32 位应用程序 设置为 False 来解决此问题,但您必须使用 32 位模式。

检查和修复步骤

以下步骤中的某些东西肯定对我有帮助。

*。在 VSCode 中打开您的 Visual Studio 解决方案文件夹并搜索类似这样的内容

<Target Name="AfterBuild">
    <MSBuild Condition=" '$(Platform)' == 'x86' " Projects="$(MSBuildProjectFile)"
        Properties="Platform=x64;PlatFormTarget=x64" RunEachTargetSeparately="true" />
</Target>

考虑将其从您的项目文件 (.csproj) 中删除

*。在 VS 中打开您的解决方案并打开配置管理器。 考虑从所有解决方案配置中删除 x64 平台。

*。对于那些有多个构建步骤来逐个构建项目的人。 考虑更改旧版本以在 x64 项目之前运行 Any Cpu (MSIL)、x86 项目。或者为不同平台配置项目的输出路径分离。 在创建部署包时要小心。考虑在项目构建运行之间累积不同的构建输出。

*。考虑为应该具有 x64 平台的项目从项目文件中清除所有 x64 内容。是这样的

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    ....
</PropertyGroup>

【讨论】:

【参考方案22】:

我刚刚删除了文件。 ¯\_(ツ)_/¯

在日志中,在堆栈跟踪之前,它说以下内容,所以我只是删除了所说的 DLL,重建了解决方案(Build > Rebuild Solution),注意到 DLL 没有被替换(也许它不应该在那里),现在一切正常。

LOG: Attempting download of new URL file:///c:/TeamE/bin/Release/XxxDevices.DLL.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.

【讨论】:

以上是关于BadImageFormatException 故障排除的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务 BadImageFormatException

BadImageFormatException 未处理

System.BadImageFormatException:如何修复 .NET 版本不匹配?

System.BadImageFormatException

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

System.BadImageFormatException:无法加载文件或程序集(来自 installutil.exe)