BadImageFormatException故障排除

时间:2012-01-25 01:07:15

标签: c# .net exception

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

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

这是我到目前为止所尝试的内容:

  • 已验证的构建设置(如Platform Target)完全相同(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.
===
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: 

21 个答案:

答案 0 :(得分:113)

  

已验证的构建设置(如Platform Target)完全相同(x86)。

这不是崩溃日志所说的:

  

装配管理器从以下位置加载:C:\ Windows \ Microsoft.NET \ Framework64

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

答案 1 :(得分:36)

在我不停地敲打桌子后,想着整个星期我都在努力解决这个问题,我正在分享对我有用的东西。我有Win7 64位,32位Oracle客户端,并且我的MVC 5项目设置为在x86平台上运行,因为Oracle的位数。我一直得到同样的错误:

  

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

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

答案 2 :(得分:16)

我发现的工作是检查&#34;使用64位版本的IIS Express for Web Sites and Projects&#34;项目和解决方案下的选项=&gt; “工具=&gt;选项”菜单下的“Web项目”部分。

答案 3 :(得分:12)

通常会在您更改.csproj的目标框架并将其恢复为您开始时的状态时发生。

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

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

在开始尝试使用项目属性来解决错误之前,这些可能只会节省大量时间。

答案 4 :(得分:7)

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

答案 5 :(得分:7)

当您的应用程序以.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时,我遇到了这个问题。

答案 6 :(得分:5)

<强>背景

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

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

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

<强>解决方案

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

答案 7 :(得分:4)

对于那些可能在以后到达这里的人......没有什么能帮助我。我所有的集会都很好。我在我的一个Visual Studio项目中有一个应用程序配置,不应该在那里。因此,请确保您的应用配置文件是必需的。

我删除了额外的应用配置,但它确实有效。

答案 8 :(得分:4)

我通过更改网络应用程序以使用其他“应用程序池”来解决此问题。

答案 9 :(得分:2)

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

答案 10 :(得分:2)

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

答案 11 :(得分:1)

在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>

答案 12 :(得分:1)

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

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

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

放置此内容的好地方就在TargetFrameworkTargetFrameworks元素之后。

答案 13 :(得分:1)

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

如下:

<块引用>

属性 -> 网页 -> 位数

enter image description here

答案 14 :(得分:0)

对于可能在以后到达这里的任何人...
对于桌面解决方案,我得到BadImageFormatException例外 所有项目的构建选项都很好(所有x86)。但解决方案的StartUp项目已改为其他项目(类库项目)。

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

此错误&#34;无法加载文件或程序集&#39;示例&#39;或其中一个依赖项。试图加载一个格式不正确的程序&#34;通常是由不正确的应用程序池配置引起的。

  1. 确保您网站当前正在运行的AppPool具有&#34;启用32位应用程序&#34;设置为False。
  2. 确保您使用的平台版本正确。
  3. 如果您在网站上收到此错误,请确保您的应用程序池设置为以正确模式运行(3.0站点应以64位模式运行)
  4. 您还应该确保visual studio中对该程序集的引用指向packages文件夹中的正确文件。
  5. 确保您在GAC for 2.0站点中安装了正确版本的dll。
  6. 使用Web项目推广WSODLib也可能导致这种情况。

答案 17 :(得分:0)

令我惊讶的是,没有其他人提到此事,因此我在没有上述帮助的情况下(我的情况)也愿意分享。

发生的事情是,一个VBCSCompiler.exe实例被某种方式卡住了,并且实际上没有释放文件句柄以允许新实例正确写入新文件,并导致了问题。当我尝试删除“ bin”文件夹并且抱怨另一个进程正在使用其中的文件时,这变得很明显。

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

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

答案 18 :(得分:0)

目标版本x64 目标服务器托管IIS 64位

如果应用程序版本针对64位操作系统,则在托管IIS的64位服务器上,将运行网站/ Web应用程序的应用程序池上的enable 32位应用程序设置为false。

enter image description here

答案 19 :(得分:0)

对于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>

答案 20 :(得分:0)

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