BadImageFormatException x64问题

17

我发誓随着微软"进化"Visual Studio,整个过程变得更加无知。

我有一个包含3个类库的Windows服务。我进入每个类库的属性并将平台目标设置为x64。我同样对Windows服务以及我添加的测试控制台项目进行了相同的操作以验证一切都正常。

我可以在我的Windows 2008 R2 x64服务器上运行控制台应用程序而没有任何问题,但是这个愚蠢的安装程序一直失败,并告诉我有一个不良图像(bad image)的问题。我确保已经将安装程序的目标平台设置为x64。

我不知道为什么这个愚蠢的东西会失败,真的很感激任何意见。我引用了其他DLL,它们可能是x86的,但我认为如果主要库被正确设置,事情就会顺利进行...


4
你可能需要注意你用来描述这个问题的措辞,因为完全有可能是你自己的错误,而不是微软的错。 - Jesus Ramos
1
听起来好像是架构不匹配的问题... - user166390
自从90年代初开始我就一直在使用微软技术,因此我认为我有资格证明它的整体实用性正在迅速下降。 - Ken Tola
关于架构不匹配的问题,我完全同意,但我无法确定问题出在哪里。就像我说的,我运行了每个可能的配置选项,并将所有内容设置为x64。通过DLLImport调用的外部DLL引用不应影响安装程序。我可以将完全相同的项目作为控制台应用程序运行而没有任何问题,但是在尝试安装Windows服务时,一切都失败了。 - Ken Tola
我阅读的所有文档都说了两件事。首先,当将Windows服务强制转换为x64模式时,您需要直接从x64文件夹引用.NET DLL,而不是通过.NET选项卡引用x86引用。其次,实际上不建议设置平台,因为如果目标服务器上有该选项,则服务将运行x64。在将所有内容恢复为“任何平台”之前,请有人确认服务是否会在“任何平台”情况下运行x64。 - Ken Tola
3个回答

29
我终于明白了-这与架构、引用或其他无关的废话毫无关系,而完全与安装程序本身有关。正如这篇文章所解释的那样,默认情况下,Visual Studio Installer使用32位DLL,这就是导致失败的原因。
为了解决这个问题,请按照以下步骤操作:
  1. 确保进入每个项目的“属性”⇒“生成”选项卡,并将“目标平台”设置为x64
  2. 单击安装项目的名称,然后单击“属性”,确保目标平台为x64
  3. 构建您的解决方案-如果解决方案未编译,请右键单击并卸载项目,然后为失败的引用加载项目。
  4. 在此处下载并安装7.0安装程序SDK
  5. 进入C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Bin文件夹,并通过双击Orca.Msi文件安装Orca
  6. 运行Orca并打开您的项目的MSI文件夹
  7. 选择二进制表格
  8. 双击记录InstallUtil的[二进制数据]单元格
  9. 确保选择“从文件名读取二进制文件”
  10. 单击浏览按钮,浏览到C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319
  11. 选择InstallUtilLib.dll
  12. 单击“打开”按钮,然后单击“确定”按钮
这就是全部内容-在Orca中保存您的MSI文件,然后部署它- x64安装应该可以正常工作,不会出现任何其他问题。

8
顺便说一下,感谢你们微软粉丝的负评,这是一个合法的问题,而且还有许多其他微软问题。你们无法接受可信的批评,这说明了很多问题。 - Ken Tola
2
谢谢Ken,终于有一个可行的解决方案了。我有一个问题。是否可能将其自动化为后置构建事件?每次发布时手动处理数十个安装程序非常耗时... - KenGey
Orca 5.0.7693.0 (2.1MB)Orca 5 – Windows 7 的 msi 编辑工具 中的一个组件,不包含整个 SDK。 - Michael Sandler
2
@KenGey - 是的,你可以将其自动化为后构建事件;请参见我在https://dev59.com/KFXTa4cB1Zd3GeqP37HV#6797989下的评论。或者直接访问https://code.msdn.microsoft.com/windowsdesktop/CSBrowserHelperObject-59c189a2#content了解详情。 - snark
不知道你是怎么找到这个解决方案的,但它非常出色。 - Talha Imam

1
我自己遇到了这个问题,在Visual Studio 2017中为长期以来是x86的应用程序构建x64版本的安装程序时。我不怀疑Ken的答案是决定性的,但是我想到由于Custom Actions是由安装程序而不是已安装的应用程序调用的,因此在我的情况下,包含Custom Actions的项目不需要与其余应用程序具有相同的位数,因为它的类从未被应用程序本身实例化。所以我将该项目的平台单独更改回x86,并重新构建了安装程序。一切都“只是工作”。当然,这取决于具有完全与解决方案其他部分隔离的Custom Actions。不再使用Orca确实让人松了一口气。

1
这个错误发生在我将一个.NET 4.5+服务安装到64位机器上时。
安装程序设置为x64
服务项目构建平台设置为x64
安装失败,出现BadImageFormatException。
对我来说,解决方案是进入服务项目属性,将构建平台更改为“Any CPU”,并且取消选中默认情况下选中的“优先使用32位”复选框(另请参阅什么意思)。

在Visual Studio 2019中取消勾选“优先使用32位”对我有用。之前一直出现BadImageFormatException错误,我花了很多时间思考可能是引用问题或者32位和64位不兼容等问题。但实际上只需要取消勾选这个选项就可以解决问题。 - Yugendhar Anveshra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接