Troubleshooting BadImageFormatException

I have a Windows service written in C# using Visual Studio 2010 and targeting the full .NET Framework 4. When I run from a Debug build the service runs as expected. However, when I run it from a Release build I get a System.BadImageFormatException (details below). I've been searching the internet for a solution but so far every thing I've found hasn't helped me find a solution.

The problem exists on both Windows 7 64-bit (dev) and Windows XP SP3 32-bit (target) systems.

Here is what I've tried so far:

  • Verified build settings such as Platform Target are all the same (x86).
  • Used peverify with the /verbose option to ensure the assembly binaries were valid.
  • Uses fuslogvw to look for any loading issues.
  • Used CheckAsm to look for missing files or assembiles.

All of these checks didn't change anything. I've included the full text of the exception information below, with some of the names changed to protect the secrets of my corporate masters.

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.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: c:\TeamE\bin\Release\XxxDevicesService.vshost.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///c:/TeamE/bin/Release/XxxDevices.DLL.
ERR: Failed to complete setup of assembly (hr = 0x8007000b). Probing terminated.


StackTrace:
at XxxDevicesService.Program.Main(String[] args)
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
234103 次浏览

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

事故记录可不是这么写的:

从 C 加载的程序集管理器: Windows Microsoft.NET Framework64

注意名称中的 64,这是64位版本的框架。在 EXE项目上设置 Target 平台设置,而不是在类库项目上设置。XxxDevicesServiceEXE 项目确定进程的位数。

类的目标框架更改时,通常会发生此错误。并将其恢复到开始时的状态。

在 app.config 的启动标记下,确保1 if support tedRuntime version = “ a different running from cs project target”。

Make sure 2 That also means checking other autogenerated or other files in may be properties folder to see if there is no more runtime mismatch between these files and one that is defined in .csproj file.

These might just save you lot of time before you start trying different things with project properties to overcome the error.

I had the same problem even though I have 64-bit Windows 7 and i was loading a 64bit DLL b/c in Project properties | Build I had "Prefer 32-bit" checked. (Don't know why that's set by default). Once I unchecked that, everything ran fine

I fixed this issue by changing the web app to use a different "Application Pool".

当您的应用程序目标。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.

对于任何可能晚些时候到达这里的人来说... ... 对我来说没有什么是有效的。我所有的装配都很好。我的一个 VisualStudio 项目中有一个应用程序配置,这个应用程序不应该出现在那里。因此,确保您的应用程序配置文件是必需的。

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

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

当我不再把头埋在桌子上思考我花了整整一个星期解决这个问题的时候,我开始分享对我有用的东西。我有 Win764位、32位 Oracle 客户端,并且由于 Oracle 位,我的 MVC 5项目设置为在 x86平台上运行。我总是犯同样的错误:

Could not load file or assembly 'Oracle.DataAccess' or one of its 尝试用不正确的 format.

我重新加载了 NuGet 包,我使用了不同应用程序中其他人使用的 DLL 的副本,我在依赖程序集中设置了代码库以指向我的项目的 bin 文件夹,我尝试了 CopyLocal 的真或假,我尝试了 < strong > 所有的方法。 最后,我做了足够的其他事情,我想检查我的代码,作为一个新的承包商,我没有颠覆设置。当我在寻找一种方法将它连接到 VS 时,我被答案绊倒了。 我发现有效的方法是不检查以下内容:

Tools
- > Options
- > Projects and Solutions
—— > Web Projects
—— > Use the 64 bit version of IIS Express for web sites and projects

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

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

在我的案例中,将 StartUp 项目更改为原始的(. exe 应用程序项目)是一种解决方案

Background

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

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

一时兴起,我试着切换设置。原来 IIS 中的应用程序池默认值为 False,但是由于某种原因,IIS 在我们的服务器上忽略了它,并且总是以 x86模式运行我们的服务。

解决方案

  • 选择应用程序池。
  • 选择 设置应用程序池默认值..。高级设置..。
  • 启用32位应用程序更改为 True。
  • Click 好的.
  • 再次选择 设置应用程序池默认值..。高级设置..。
  • 启用32位应用程序更改为 False。
  • 好的

我发现有效的方法是在 Projects and Solutions = > Web Projects 部分的 Tools = > Options 菜单下检查“ Use the 64 bit version of IIS Express for Web Sites and Projects”选项。

当我面对这个问题的时候,下面的事情为我解决了这个问题:

我在另一个 exe 中调用一个 OpenCV dll,我的 dll 没有包含在 exe 文件的文件夹中已经需要的 OpenCV dll,比如 highgui、 Features 2d 等等。我复制了所有这些到我的 exe 项目的目录,它突然工作。

删除对 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>

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

  1. 确保当前运行站点的 AppPool 中的“ Enable 32-Bit Applications”设置为 False。
  2. 确保为平台使用了正确的版本。
  3. If you are getting this error on a web site, ensure that your application pool is set to run in the correct mode (3.0 sites should run in 64 bit mode)
  4. 您还应该确保在可视化工作室中对该程序集的引用指向的是包文件夹中的正确文件。
  5. 确保在 GAC 中为2.0站点安装了正确的 dll 版本。
  6. 这也可能是由于 WSODLibs 与 Web 项目一起推广造成的。

对于 .NET 核心,有一个 VisualStudio2017错误可能导致项目属性 Build 页显示不正确的平台目标。一旦你发现问题所在,变通方法就变得相当简单了。您可以将目标更改为其他值,然后再将其更改回来。

或者,可以将运行时标识符添加到。Csproj.如果你需要你的。以 x86格式运行,以便加载 x86本机 DLL,请在 PropertyGroup中添加以下元素:

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

把它放在 TargetFrameworkTargetFrameworks元素之后是一个很好的地方。

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

发生的情况是,VBCSCompiler.exe 实例被卡住了,实际上没有释放文件句柄,以允许新实例正确地写入新文件,这导致了问题的产生。当我试图删除“ bin”文件夹时,这种情况变得明显起来,它抱怨另一个进程正在使用那里的文件。

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

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

目标体型 x64 托管 IIS64位的目标服务器

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

enter image description here

对于 CI/CDMSBuild,< strong > DevEnv

Your build-machine log shows - MSB3270 ... MSIL vs 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位模式。

检查和修复的步骤

Something from the following steps definitely helped me.

* . 在 VSCode 中打开 VisualStudio 解决方案文件夹并搜索类似下面的内容

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

考虑从项目文件中删除它(. csproj)

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

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

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

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

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

As follows:

属性-> 网页-> 比特

enter image description here

之所以会发生这种情况,是因为 AnyCPU 的某个项目的平台目标在 Properties > Build 中被设置为 x86。在那里改变它解决了问题。

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

在日志中,在堆栈跟踪之前,它显示了以下内容,所以我只是删除了所说的 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.

还请注意,正在使用的“ WebView2Loader.dll”版本非常关键。我对“微软”也有同样的问题。WebView2.FixedVersionRuntime. 101.0.1210.39.当我试图使用类型为“ HTMLView”或“ FormView”的 MMC Snap-Ins 中的 WebView2组件时。

我只是复制上面提到的 dll 文件(版本1.0.1248.0,大小 = 157640字节)在一个适当的路径,可以访问的项目(你可以只是把它旁边的项目输出文件首先测试它) ,然后 WebView2浏览器开始按照预期的功能。微软的错误消息有时候(至少在我的案例中)有一点误导性,没有传达足够的重点信息。

I received "BadImageFormatException" that normally occurs when you mix platform targets (for example using a dll file compiled in X64 in an application that targeted for x86 or vice versa) or mix native code and .NET but that was not my problem at all. I hope this help one who may stuck in.

在 API 项目中我也面临着同样的问题。实际上我使用的是 VS2019。 My project is perfectly built but facing this when running through IIS.

而且 API 应用程序也无法通过显示此错误来连接 这对我有用。 Vs2019-工具-选项

VS2019 -> Tools -> Options -> Projects and Solutions -> Web Projects -> Enable "Use the 64bit version of IIS Express for Websites and Projects