排除BadImageFormatExceptionexception

我有一个用C#编写的使用Visual Studio 2010的Windows服务,它的目标是完整的.NET Framework 4.当我从Debug版本运行时,服务按预期运行。 但是,当我从发布版本运行它,我得到一个System.BadImageFormatException(下面的细节)。 我一直在寻找一个解决scheme的互联网,但迄今为止,我find的每件事都没有帮助我find解决scheme。

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

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

  • 已validation的构build设置(如Platform Target)都是相同的(x86)。
  • 使用/ verbose选项使用peverify来确保组件二进制文件是有效的。
  • 使用fuslogvw来查找任何加载问题。
  • 使用CheckAsm查找丢失的文件或集合。

所有这些检查都没有改变任何东西。 我在下面列出了例外情况的全文,其中一些名字被改变,以保护我公司主人的秘密。

 System.BadImageFormatException是未处理的
   Message =无法加载文件或程序集“XxxDevices,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或它的某个依赖项。 试图加载格式不正确的程序。
  来源= XxxDevicesService
   FileName = XxxDevices,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null
   FusionLog =从C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ clr.dll加载的程序集pipe理器
在可执行文件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。
 ===
日志:此绑定启动默认加载上下文。
日志:使用应用程序configuration文件:c:\ TeamE \ bin \ Release \ XxxDevicesService.vshost.exe.Config
日志:使用主机configuration文件: 
日志:使用C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config中的计算机configuration文件。
日志:此时策略不适用于引用(私有,自定义,部分或基于位置的程序集绑定)。
日志:尝试下载新的URL文件:/// c:/TeamE/bin/Release/XxxDevices.DLL。
 ERR:无法完成程序集的设置(hr = 0x8007000b)。 探测终止。

  堆栈跟踪:
       在XxxDevicesService.Program.Main(String [] args)
       在System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)
       在Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallbackcallback,对象状态,布尔ignoreSyncCtx)
       在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallbackcallback,对象状态)
       在System.Threading.ThreadHelper.ThreadStart()
  的InnerException: 

已validation的构build设置(如Platform Target)都是相同的(x86)。

这不是崩溃日志所说的:

程序集pipe理器从C:\ Windows \ Microsoft.NET \ Framework64加载

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

在我花了整整一周的时间思考了这个问题之后,我停止了把头撞到桌面上,我分享了为我工作的东西。 我有Win7 64位,32位Oracle客户端,并且我的MVC 5项目设置为在x86平台上运行,这是因为Oracle不太友善。 我不断收到同样的错误:

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

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

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

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

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

在开始尝试不同的项目属性以克服错误之前,这些可能会节省您很多时间。

我发现的工作是在工具=>选项菜单下的项目和解决scheme=> Web项目部分检查“使用IIS网站和项目的64位版本”选项。

我有同样的问题,即使我有64位Windows 7,我正在加载一个64位DLL B / C在项目属性| build立我有“首选32位”检查。 (不知道为什么这是默认设置)。 一旦我没有选中,一切运行良好

当您的应用程序以.NET Framework 4.5(例如)为目标并且您具有以下app.config时,您也可以得到此exception:

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

当试图启动应用程序的debugging时,您将得到BadImageFormatException。

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

我最近有这个问题,当我试图改变目标平台从一个旧的.NET 2.0项目到.NET 4.5。

背景

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

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

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

  • select应用程序池。
  • select设置应用程序池默认值…高级设置…。
  • 启用32位应用程序更改为True。
  • 点击OK
  • 再次select设置应用程序池默认值…高级设置…。
  • 更改启用32位应用程序回到False。
  • 点击OK

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

对于任何可能稍后到达这里的人来说……没有任何工作可以为我所用。 我所有的议会都很好。 我有一个应用程序configuration在我的一个Visual Studio项目,应该不会在那里。 所以请确保您的应用程序configuration文件是必要的。

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

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

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

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

我从另一个exe文件中调用OpenCV dll,我的dll没有包含像我的exe文件的文件夹中的highgui,features2d等已经需要的opencv dll。 我将所有这些复制到我的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> 

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

  1. 确保您的站点正在运行的AppPool具有“启用32位应用程序”设置为False。
  2. 确保您的平台使用的是正确的版本。
  3. 如果您在网站上发生此错误,请确保您的应用程序池设置为以正确模式运行(3.0站点应以64位模式运行)
  4. 你还应该确保在Visual Studio中对该程序集的引用指向了packages文件夹中的正确文件。
  5. 确保您的GAC for 2.0网站中安装了正确版本的dll。
  6. 这也可能是由Web项目提升的WSODLibs造成的。

对于任何可能在稍后抵达的人
对于桌面解决scheme,我得到了BadImageFormatExceptionexception。
所有项目的构build选项都很好(全部为x86 )。 但是解决scheme的StartUp项目改为其他项目(类库项目)。

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