【问题标题】:Incompatibility between x86 and x64 in Installation solution安装解决方案中x86和x64不兼容
【发布时间】:2011-02-05 05:04:21
【问题描述】:

我的安装解决方案具有安装程序项目(不是 Web 安装程序,而是简单的安装程序),它借助我自己的代码执行我的安装步骤的另外两个 dll 项目来安装 NT 服务、Web 服务和网站。在安装程序项目的用户操作中,我调用其中一个项目的安装程序功能,并且该项目调用第二个项目的安装程序:安装程序 -> MiddleCaller -> InstallationCore。

所有这些都是在 Windows 7 上开发的,当我全部编译为 32 位时工作正常。

项目必须在 Windows 2008 上运行。由于某些原因,所有项目都必须是 x64 位。
为此,在 MiddleCaller 和 InstallationCore 中,我在项目上单击鼠标右键 -> 构建 -> 目标 x64。为了在安装程序的属性中将安装程序项目移动到 64 位(当项目处于活动状态时),我检查:目标平台:x64。

当我在 x86 上运行安装时出现错误:

The installation package is not supported by this processor type"

这很好,因为现在我知道我的安装是用 64 位编译的,但是当我在 windows 2008 上运行它时,我得到:

Error 1001. Exception occured while initializing the instance:  
System.BadImageFormatException: could not load file or Assembly   
'MiddleCaller, v...' or one of its dependencies. An attempt was  
made to load a program with an incorrect format.  

有人知道我需要做什么才能在 x64 上正常安装吗?
可能我还没有将安装程序项目移动到 x64 位,如果是,我在哪里执行此操作?

谢谢你的到来。

【问题讨论】:

    标签: visual-studio windows-7 installation windows-server-2008 64-bit


    【解决方案1】:

    在这个场景中有一些不清楚的地方。我了解到您在运行调用 64 位程序集的 32 位安装程序时遇到困难。如果这是正确的,那么你正在做的事情是不允许的。您不能在同一进程中拥有 32 位和 64 位程序集——这是非法的。如果安装程序直接引用 64 位程序集,则安装程序也必须是 64 位的。

    澄清:我相信 32 位安装程序可以安装 64 位应用程序,但它只能通过复制 64 位文件而不是通过实际调用 64 位文件来实现。唯一受支持的方法是,如果将 64 位文件加载到不同的进程中并使用 IPC 调用它们,但即使这样也可能是一个糟糕的解决方案。

    在您的情况下,我建议您将安装程序转换为 64 位安装程序。

    【讨论】:

    • 64 位中所有可能的东西。还有正在安装的应用程序以及安装应用程序的项目。在将上述属性更改为 x64 位后,我不确定是否运行 32 位安装程序...如果是这样,您知道如何使安装程序成为 64 位吗?是的,我仍然复制 dll,我只将项目输出用于安装包中的两个安装项目。
    【解决方案2】:

    所以,最终,我在 AnyCpu 模式下编译了 MiddleCaller 和 InstallationCore,而我需要安装的所有 dll 和可执行文件都以 x64 位编译。所有这些都是我在 Windows 2008 x64 位上编译的,带有 x64 位外部依赖项(如 Oracle 客户端)。

    【讨论】:

      【解决方案3】:

      在 Microsoft 网站上找到了一个快速提示,可能对 troubleshooting setup and deployment projects 有用:

      64 位托管自定义操作引发 System.BadImageFormatException 异常

      如果将 64 位托管自定义操作添加到安装项目,Visual Studio 构建过程会将 32 位版本的 InstallUtilLib.dll 作为 InstallUtil 嵌入到 MSI 中。反过来,加载 32 位 .NET Framework 以运行 64 位托管自定义操作并导致 BadImageFormatException 异常。

      对于解决方法,请将 32 位 InstallUtilLib.dll 替换为 64 位版本。

      从 Windows Installer SDK 在 Orca 中打开生成的 .msi。

      选择二进制表。

      双击记录InstallUtil的单元格[Binary Data]。

      确保选中“从文件名读取二进制文件”并单击“浏览”按钮。

      浏览到 %WINDIR%\Microsoft.NET\Framework64\v2.0.50727。

      注意 Framework64 目录只安装在 64 位平台上,对应 64 位处理器类型。 选择 InstallUtilLib.dll。

      点击打开按钮。

      点击确定按钮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 2010-12-07
        • 1970-01-01
        相关资源
        最近更新 更多