14

将托管代码从 x86 迁移到 x64 平台时,我遇到了问题。我有一个 WiX 项目来创建一个将通过 Bootstrapper 执行的MSI 。

在 x86 平台上,根据 Project.wxs 文件将文件复制到“程序文件”中。但是,如果通过 Bootstrapper 在 x64 平台上安装相同的 MSI,默认情况下,所有安装文件都会复制到“Program Files (x86)”中,并且应用程序的功能失败,因为它在 12-hive 层次结构中找不到必要的文件程序文件(对于 64 位,它是“C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\CONFIG”)。

我曾尝试使用 <?if $(var.ProcessorArchitecture)=x64 ?> 之类的预处理器变量,但我需要在项目属性中将此变量硬编码为 x86 或 x64。最后,我最终为两个不同的平台提供了两个不同的 MSI,这对我来说不是一个理想的解决方案。

那么,通过 WiX,是否可以识别平台以确保安装在所需位置?

4

3 回答 3

20

我不相信您将能够拥有一个支持这两个平台的 MSI。您将需要为 x86 和另一个 x64 创建一个 - 好消息是您不需要维护另一个 WiX 项目来实现这一点。

我过去这样做的方式是在产品定义的开头有以下内容。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">

    <?if $(var.Platform)=x64 ?>
      <?define msiProductId = "102F7DF4-19A6-4d3d-987F-FF57A2031593" ?>
      <?define win64Flag = "yes" ?>
    <?else ?>
      <?define msiProductId = "8AE46CAF-220F-4B9F-9527-D4A19A27C45B" ?>
      <?define win64Flag = "no" ?>
    <?endif ?>

    <Product Id="$(var.msiProductId)"
             Name="My Product"
             Language="1033"
             Version="1.0.0"
             Manufacturer="Acme"
             UpgradeCode="E2575E4A-A62E-4460-B96D-B722C79C8EAA">

        <Package InstallerVersion="400"
                 Compressed="yes"
                 InstallPrivileges="elevated"
                 Platform="$(var.Platform)"
        />

        <!-- Rest of product definition goes here -->

    </Product>
</Wix>

我忘记了我在哪里得到了为每个平台使用不同 ProductID 的建议。

我创建了“win64Flag”变量来让其他 WiX 元素在跨平台场景中正常工作。例如,以下是您如何使用它来使单个 RegistrySearch 定义适用于两个平台,并且应该解决您在定位 12-hive 层次结构时遇到的问题。

<Property Id="WSE12DIRECTORY">
    <RegistrySearch Id="Reg_WSE12DIRECTORY"
                    Type="raw"
                    Root="HKLM"
                    Key="SOFTWARE\Microsoft\Shared Tools\Web Server Extensions\12.0"
                    Name="Location"
                    Win64="$(var.win64Flag)"
    />
</Property>

一切就绪后,只需在Candle命令行上传递“平台”预处理器变量的相关值,或在 Visual Studio 中选择目标平台。

于 2009-12-07T14:03:06.773 回答
13

您可以使用 Condition 语句(此处的文档)来检测安装程序在安装时运行在哪个平台上。这允许您只创建一个适用于所有平台的安装程序。

64 位平台的测试是VersionNT64,相反,非 64 位平台的测试是NOT VersionNT64.

例如:

<Component Id="SomeComponentId" Guid="SomeGuid">
    <Condition>
        <![CDATA[NOT(VersionNT64)]]>
    </Condition>
    <File Id="SomeFile" Name="Somefile.exe" Source="$(var.UI.TargetDir)\ProjectOutput.exe" />
</Component>
于 2009-12-31T02:25:48.560 回答
2

您可以使用

candle -arch x86 

或者

candle -arch x64 

结果将生成Platform="x64"and属性。Win64="true"

于 2012-08-23T10:53:59.407 回答