Ответ 1
Я не верю, что вы сможете иметь одну 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-улей.
<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.