Windows 服务在从 3.5 迁移的 Windows Server 2008、x64、.NET 4 上引发 System.BadImageFormatException

Posted

技术标签:

【中文标题】Windows 服务在从 3.5 迁移的 Windows Server 2008、x64、.NET 4 上引发 System.BadImageFormatException【英文标题】:Windows Service throws System.BadImageFormatException on Windows Server 2008, x64, .NET 4 migrated from 3.5 【发布时间】:2011-03-20 03:53:00 【问题描述】:

我尝试将服务 EXE 文件编译为 AnyCPU、x86 和 x64。它适用于我的 Windows 7 x64 机器。我正在使用 installutil 进行安装,.NET 4 版本。

当我启动服务时,我得到一个错误。它什么也没说,但它确实指出了加载了哪些模块。可能感兴趣的人:

LoadedModule[0]=D:\yellowbook\grapevine_service\grapevinesystemservice.exe LoadedModule3=C:\Windows\system32\KERNEL32.dll LoadedModule4=C:\Windows\system32\KERNELBASE.dll LoadedModule[9]=C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscoreei.dll LoadedModule[17]=C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll LoadedModule[18]=C:\Windows\WinSxS\amd64_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4927_none_88dce9872fb18caf\MSVCR80.dll LoadedModule[22]=C:\Windows\assembly\NativeImages_v2.0.50727_64\mscorlib\9a017aa8d51322f18a40f414fa35872d\mscorlib.ni.dll

我可以将此服务作为带有命令行开关的控制台应用程序运行,这会产生:

未处理的异常: System.BadImageFormatException:可以 不加载文件或程序集 'grapevinesystemservice.exe' 或其中之一 它的依赖关系。这个大会是 由比 当前加载的运行时,不能 加载。文件名: 'grapevinesystemservice.exe'

我已尝试对注册表进行破解以强制使用最新的运行时。没有效果。我在反射中查看了已安装的 EXE 文件,以确保它没有被我的构建服务器修改,但它的目标是 4.0.30319。我的本地、构建和测试服务器都有 30319 作为 .NET 4 版本。从来没有一个测试版/RC。

它们没有在加载模块中列出,但我也在使用 log4net(从源代码在 .NET 4 中重建)、StructureMap、NoRM (MongoDB)、AutoMapper、Newtonsoft.Json ,以及我的团队构建的许多其他 DLL 文件。

【问题讨论】:

如果服务启动失败,事件日志通常包含附加信息。你检查了吗?您是否还确保所有引用的程序集都针对 .NET 4.0 具有正确的位数?您的服务似乎使用的是 .NET 2.0 版本的 mscorlib。 是的,事件日志令人惊讶地没有任何有用的东西,除了列出已加载模块的转储文件的链接......我没有包括那个只是因为问题已经很长了我害怕把人吓跑。 :-) 不过感谢您的指点。 只是检查问题出在您的项目还是您的服务器上:一个简单的、新创建的 .NET 4.0 服务是否安装和运行完美? 这将是我的下一个计划。我拖了后腿,因为安全性使得从这里到那里获取代码变得如此困难。如果这个 .net 框架修复(见下文)不能修复它,那是我的下一个计划。再次感谢另一个好建议。实际上,如果事实证明我的框架安装失败了,那么您的第一个答案也将是 100% 正确的。 【参考方案1】:

您是否尝试过在gravevinesystemservice.exe 的配置文件中设置requiredRuntime?就像提到的 0xA3 一样,它似乎没有设置为使用 4.0。

<startup>
  <requiredRuntime version="v4.0.20506" safemode="true"/>
</startup>

【讨论】:

看起来很有希望...不知何故,我的配置在途中某处被更改为 2.0。 (在本地设置为 4)。修复这个并运行给了我一个错误,暗示没有安装框架......它是......我现在正在尝试对其进行修复。不过肯定有些动静。好一个eschatonizer! 好的,就是这样。伙计,我有一阵子不会去检查了。谢谢。现在去弄清楚为什么它被改变了......【参考方案2】:

您的一个依赖 DLL 文件尚未使用 AnyCPU 编译。有关如何检查它们的详细信息,请参阅 Stack Overflow 问题 How to determine if a .NET assembly was built for x86 or x64?

【讨论】:

Reflector 也提供此信息,并且随项目部署的每个 dll 都设置为 Any。 (我重新编译为 x86 以确保反射器正常工作) 谢谢你的回答。我认为它必须是这些方面的东西。我很快就会使用那里提到的工具。【参考方案3】:

我在使用 installutil 安装服务时也看到了上述问题。问题是我使用 MSFT 的 dotNetFx40_Full_setup.exe 安装了 .NET 4 Framework。安装程序不会将 4.0 Framework 的引用添加到您的系统 PATH 环境变量中。

将以下内容添加到您的 PATH 环境变量中:

c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319;c:\WINDOWS\Microsoft.NET\Framework\v3.5

这在安装和运行期间都对我有用。

【讨论】:

【参考方案4】:

我发现此问题的另一个原因:如果您的 Web 服务上安装了多个 .NET 框架,则使用 installutil.exe 将默认使用最旧的版本。如果您正在安装的服务依赖于较新版本的框架,这可能会导致问题。

【讨论】:

以上是关于Windows 服务在从 3.5 迁移的 Windows Server 2008、x64、.NET 4 上引发 System.BadImageFormatException的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WiX Burn 在 Windows 8 和 Windows Server 2012 上安装 .NET Framework 3.5?

Windows Server 2012下的文件迁移

在从本地迁移到Azure SQL数据库时如何计划生产切换?

wind 开启远程访问

我会在从 v3 迁移到最新 v7 的迁移 lucene 索引中获得性能改进吗

由于核心数据迁移,应用程序在从应用商店更新后崩溃