Идентификация платформы в WiX 3.0
Я сталкиваюсь с проблемами при переносе управляемого кода с платформы x86 на x64. У меня есть проект WiX для создания MSI, который будет выполняться через Bootstrapper.
На платформе x86 файлы копируются в "Program Files" в соответствии с файлом Project.wxs. Но если тот же MSI установлен на платформе x64 через Bootstrapper, все установочные файлы по умолчанию копируются в "Program Files (x86)", и функциональность приложения не работает, так как не удается найти необходимые файлы в иерархии 12-hive Программные файлы (для 64-разрядных это "C:\Program Files\Common Files\Microsoft Shared\ расширения веб-сервера \12\CONFIG").
Я попытался использовать переменные препроцессора, такие как If $ (var.ProcessorArchitecture) = x64?>, Но мне нужно жестко закодировать эту переменную в свойстве проекта в x86 или x64. Наконец, я получаю два разных MSI для двух разных платформ, что для меня нежелательно.
Итак, можно ли с помощью WiX идентифицировать платформу, чтобы обеспечить установку в нужном месте?
3 ответа
Я не верю, что у вас будет один 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.
Вы можете использовать оператор 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>
Ты можешь использовать
candle -arch x86
или же
candle -arch x64
и как результат Platform="x64"
а также Win64="true"
атрибуты будут сгенерированы.