对BadImageFormatException进行故障排除


107

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

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

到目前为止,这是我尝试过的:

  • 经过验证的构建设置(例如Platform Target)都相同(x86)。
  • 使用带有/ verbose选项的peverify来确保程序集二进制文件有效。
  • 使用fuslogvw查找任何加载问题。
  • 使用CheckAsm查找丢失的文件或组件。

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

System.BadImageFormatException未处理
  消息=无法加载文件或程序集'XxxDevices,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一。试图加载格式错误的程序。
  来源= XxxDevicesService
  FileName = XxxDevices,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
  FusionLog =程序集管理器从以下位置加载:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll
在可执行文件c:\ Dev \ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe下运行
---详细的错误日志如下。 

===预绑定状态信息===
日志:用户= XXX
日志:DisplayName = XxxDevices,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
 (完全指定)
日志:Appbase = file:/// c:/ Dev / TeamE / bin / Release /
日志:初始PrivatePath = NULL
调用程序集:XxxDevicesService,版本= 1.0.0.0,文化=中性,PublicKeyToken =空。
===
日志:此绑定在默认的加载上下文中开始。
日志:使用应用程序配置文件: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。
ERR:无法完成装配的设置(hr = 0x8007000b)。探测终止。

  堆栈跟踪:
       在XxxDevicesService.Program.Main(String [] args)
       在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String []参数)
       在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在System.Threading.ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态,布尔ignoreSyncCtx)
       在System.Threading.ExecutionContext.Run(ExecutionContext执行上下文,ContextCallback回调,对象状态)
       在System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
c#  .net  exception 

您是否在混用本机代码/ .net?
基思·尼古拉斯

1
您可以正确地知道此异常与x86 / x64位差异相关联。我认为这不是Web应用程序,对吗?另外,什么类型的装配是XxxDevicesService?是否针对特定平台(例如32位)进行编译?如果是这样,则必须将平台编译为32位。
Reddog 2012年

Answers:


121

经过验证的构建设置(例如Platform Target)都相同(x86)。

崩溃日志不是这样写的:

程序集管理器从以下位置加载:C:\ Windows \ Microsoft.NET \ Framework64

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


6
在检查EXE项目时,请同时检查Debug Release。:/
克里斯

44

当我不再想着整个问题的整个星期都在桌子上敲打头之后,我正在分享对我有用的东西。我具有Win7 64位,32位Oracle Client,并且由于Oracle的限制,我将MVC 5项目设置为在x86平台上运行。我不断收到相同的错误:

无法加载文件或程序集“ Oracle.DataAccess”或其依赖项之一。试图加载格式错误的程序。

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


3
真是救命!!谢谢。对我来说,我必须进行实际检查,因为我的项目实际上是x64。再次感谢!!!
viper

在这里得到了所有帮助之后,我很高兴能够向前支付其中的一部分!
约瑟夫·摩根

3
对于使用本地IIS的用户,请确保将应用程序池的“启用32位应用程序”(在“高级设置”下)设置为True
Eric Eskildsen

一个addenum到@在上面的应用程序池约“启用32位应用程序”,即使你不想做的是,在实际环境中,翻转该交换机可以提供额外的线索,你是否EricEskildsen的评论面临着32位/ 64位问题或其他问题。
CVn

繁荣!就是这样
itslittlejohn '17

21

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


你是救世主。+1
阿米特·库玛

我重新安装了VS,并正在解决此问题(谢谢-此解决方案有效)。对我来说,这个故事的寓意是,如果我知道我一开始没有更改任何代码,也许我应该先看看VS的配置。
taylorswiftfan,

@Lucy复选框“将IIS Express的64位版本用于网站和项目”已禁用
k_kumar,

请告诉露西
k_kumar,

12

当您更改.csproj的目标框架并将其还原回开始时,通常会发生这种情况。

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

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

在开始尝试使用项目属性进行其他操作来克服该错误之前,这些操作可能会节省大量时间。


我遇到了类似的问题,您的答案就是我的解决方案。我的app.config具有不同的受支持运行时。
了KrisztiánKIS

9

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


1
同样在这里。这成功了。引用了64位程序集,并且将活动的构建配置设置为“任何CPU”,但是由于此“首选32位”设置,大概在运行应用程序时使用了32位,从而造成了麻烦。
Bernoulli IT

在“调试”模式下选择了任何CPU而不是x86,并且像魅力一样工作。
卡迪·德摩纳哥(Ji DeMonaco Jr)

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

背景

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

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

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

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

4

我通过将Web应用程序更改为使用其他“应用程序池”来解决此问题。


4

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

我删除了多余的应用程序配置,它可以正常工作。


为我修复。我的App.config将.NET 4.5.1应用程序设置为2.0 CLR!
贾里德·瑟斯克

4

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

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

在此处输入图片说明


2

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


2

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


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>

对我来说是System.Net.Http。谢谢你
Snickbrack

1

对于.NET Core,存在一个Visual Studio 2017错误,该错误可能导致项目属性的``构建''页面显示不正确的平台目标。一旦发现问题所在,解决方法就很容易了。您可以将目标更改为其他值,然后再将其更改回。

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

<RuntimeIdentifier>win-x86</RuntimeIdentifier>

一个合适的放置位置是在TargetFrameworkor TargetFrameworks元素之后。


1

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

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

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

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


我的解决方案也是删除所有bin和debug目录。
gabnaim

0

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

在我的情况下,将StartUp项目更改为原始项目(.exe应用程序项目)


0

当我面对这个问题时,以下为我解决了这个问题:

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


0

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

  1. 确保您的站点当前正在运行的AppPool的“启用32位应用程序”设置为False。
  2. 确保您使用的平台版本正确。
  3. 如果在网站上收到此错误,请确保将应用程序池设置为以正确的模式运行(3.0个站点应以64位模式运行)
  4. 您还应确保在Visual Studio中对该程序集的引用指向packages文件夹中的正确文件。
  5. 确保您在GAC 2.0版站点中安装了正确版本的dll。
  6. 这也可能是由于Web项目中提升了WSODLib。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.