我不相信您将能够拥有一个支持这两个平台的 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 中选择目标平台。