単一の MSI で両方のプラットフォームをサポートできるとは思えません。x86 用に 1 つ、x64 用にもう 1 つ作成する必要があります。幸いなことに、これを実現するために別の 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 ハイブ階層の検索で発生している問題を解決する方法を次に示します。
<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コマンドラインで「Platform」プリプロセッサ変数に関連する値を渡すか、Visual Studio でターゲット プラットフォームを選択するだけです。