Я не верю, что у вас будет один 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>
Имея все это в наличии, можно просто передать соответствующее значение переменной препроцессора 'Platform' в командной строке Candle или выбрать целевую платформу в Visual Studio .