一尘不染

对BadImageFormatException进行故障排除

c#

我有一个使用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:

阅读 347

收藏
2020-05-19

共1个答案

一尘不染

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

崩溃日志不是这样写的:

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

Note the 64 in the name, that’s the home of the 64-bit version of the
framework. Set the Target platform setting on your EXE project, not your
class library project. The XxxDevicesService EXE project determines the
bitness of the process.

2020-05-19