BadImageFormatException x64 问题

Posted

技术标签:

【中文标题】BadImageFormatException x64 问题【英文标题】:BadImageFormatException x64 Issue 【发布时间】:2012-05-03 17:50:48 【问题描述】:

我发誓微软越“进化”Visual Studio,整个过程就会变得越无知。

我有一个包含 3 个类库的 Windows 服务。我进入每个类库的属性并将平台目标设置为 x64。我对 Windows 服务以及我添加以验证所有内容的测试控制台项目做了同样的事情。

我可以在我的 Windows 2008 R2 x64 服务器上毫无问题地运行控制台应用程序,但是愚蠢的安装程序不断地轰炸并告诉我我的图像不好。我确实确保已将安装程序的目标平台设置为 x64。

我不知道这个愚蠢的东西会不会爆炸,并且非常感谢任何见解。我确实引用了其他 DLL,那些可能是 x86,但我认为如果主库设置正确,那么一切都会正常工作......

【问题讨论】:

你可能想看看你用来描述这个问题的措辞,因为这完全有可能是你的错误,而不是微软的错。 听起来有人架构不匹配... 自从我从 90 年代初就开始使用 MS 技术,我认为我有资格证明它的整体实用性迅速下降。 至于架构不匹配,我完全同意,但我不知道问题出在哪里。就像我说的那样,我遍历了所有可能的配置选项并将所有内容都设置为 x64。外部 DLL 引用(通过 DLLImport 调用调用)不应影响安装程序。我可以毫无问题地将确切的项目作为控制台应用程序运行,但在尝试安装 Windows 服务时一切都失败了。 我读过的所有文档都说了两件事。首先,当强制 Windows 服务进入 x64 模式时,您需要直接从 x64 文件夹引用 .NET DLL,而不是通过 .NET 选项卡,因为这些都是 x86 引用。其次,实际上不建议设置平台,因为如果该选项在目标服务器上可用,该服务将运行 x64。在将所有内容恢复为“任何平台”之前,有人可以验证该服务是否可以在“任何平台”场景下运行 x64 吗? 【参考方案1】:

我终于弄明白了——它与架构、参考或任何其他废话无关,而与安装程序本身有关。 As this article explains – 默认情况下,Visual Studio 安装程序使用 32 位 DLL,这就是导致失败的原因。

要解决这个问题,只需按照以下步骤操作:

    确保进入每个项目的“属性”⇒“构建”选项卡,并将“目标平台”设置为 x64 点击安装项目的名称,然后点击属性,确保目标平台为 x64 构建您的解决方案 - 如果解决方案无法编译,请右键单击并卸载项目,然后为那些引用失败的项目加载项目。 Go here 并下载并安装 7.0 INstaller SDK 进入 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin 文件夹并通过双击 Orca.Msi 文件安装 Orca 运行 Orca 并打开项目的 MSI 文件夹 选择二进制表 双击记录InstallUtil的单元格[Binary Data] 确保选中“从文件名读取二进制文件” 单击浏览按钮浏览到 C:\Windows\Microsoft.NET\Framework64\v4.0.30319 选择 InstallUtilLib.dll 单击“打开”按钮,然后单击“确定”按钮

就是这样 - 将您的 MSI 文件保存在 Orca 中,然后部署它 - x64 安装应该可以正常工作,没有任何进一步的问题。

【讨论】:

顺便说一句,感谢 MS 宝贝们的反对票 - 这是一个合法的问题以及许多其他 MS 问题,而且您无法忍受可信的批评这一事实充分说明了您。 感谢 Ken,终于找到了一个可行的解决方案。我有个问题。是否可以作为后期构建事件自动执行此操作?每个版本手动为数十个 onf 安装程序执行此操作非常耗时... Orca 5.0.7693.0 (2.1MB) 没有来自Orca 5 – msi editing tool for Windows 7的整个SDK @KenGey - 是的,您可以将其作为构建后事件自动化;在***.com/a/6797989/1843329 下查看我的评论。或直接前往code.msdn.microsoft.com/windowsdesktop/…了解详情。 不知道你是怎么找到这个解决方案的,但它工作得很好。【参考方案2】:

我自己也遇到了这个问题,在 Visual Studio 2017 中,为长期使用 x86 的应用程序的 x64 版本构建安装程序。

我不怀疑 Ken 的回答是确定的,但我突然想到,由于自定义操作是由安装程序调用的,而不是由已安装的应用程序调用,因此至少在我的情况下,不需要该项目包含自定义操作以与应用程序的其余部分具有相同的位数,因为它的类永远不会被应用程序本身实例化。

所以我将那个项目的平台单独改回 x86,并重新构建了安装程序。

这一切都'刚刚工作'。

当然,这取决于是否拥有与解决方案的其余部分完全隔离的自定义操作。然而,不必使用 Orca 真是一种解脱。

【讨论】:

【参考方案3】:

这个错误发生在我将 .Net 4.5+ 服务安装到 64 位机器上。

安装程序设置为 x64 服务项目构建平台设置为x64

安装失败并出现 BadImageFormatException。

对我来说,解决方案是转到服务项目属性,将构建平台更改为“Any CPU”,并取消选中“Prefer 32bit”默认选中的复选框(另请参阅what does it mean)。

【讨论】:

取消选中“首选 32 位”在 Visual Studio 2019 中为我工作。遇到了 BadImageFormatException。我花了很多时间思考一些参考问题,32 位到 64 位不兼容可能存在一些问题,反之亦然。所以取消选中这个选项就行了。

以上是关于BadImageFormatException x64 问题的主要内容,如果未能解决你的问题,请参考以下文章

pinvoke c 函数 - System.BadImageFormatException

WCF 服务 BadImageFormatException

BadImageFormatException 未处理

System.BadImageFormatException:如何修复 .NET 版本不匹配?

System.BadImageFormatException

.NET 程序集中 BadImageFormatException 的替代原因?