WiX: запретить запуск 32-разрядного установщика в 64-разрядной версии Windows - PullRequest
17 голосов
/ 17 марта 2010

Из-за путаницы пользователей нашему приложению требуются отдельные установщики для 32-разрядных и 64-разрядных версий Windows. Хотя 32-разрядный установщик работает нормально на win64, он потенциально может создать проблемы с поддержкой, и мы хотели бы предотвратить это.

Я хочу запретить запуск 32-разрядного установщика MSI на 64-разрядных компьютерах с Windows. Для этого у меня есть следующее условие:

<Condition Message="You are attempting to run the 32-bit installer on a 64-bit version of Windows.">
  <![CDATA[Msix64 AND (NOT Win64)]]>
</Condition>

С Win64, определенным так:

<?if $(var.Platform) = "x64"?>
<?define PlatformString = "64-bit"?>
<?define Win64 ?>
<?else?>
<?define PlatformString = "32-bit"?>
<?endif?>

Дело в том, что я не могу заставить этот чек работать правильно. Либо он срабатывает постоянно, либо ни разу. Цель - проверить наличие переменной msix64 времени выполнения и переменной Win64 времени компиляции и выдать ошибку, если они не совпадают, но логика не работает так, как я намереваюсь. Кто-нибудь придумал лучшее решение?

Ответы [ 4 ]

15 голосов
/ 17 марта 2010

Включите элемент Condition только в ваш 32-битный пакет (т. Е. С использованием оператора препроцессора «if»). Условие будет «НЕ Msix64»: условия запуска - это вещи, которые должны быть истинными, поэтому, если Msix64 установлен, условие запуска не будет выполнено, а это означает, что это ОС x64 и 32-разрядный пакет, и правильная вещь - это блок.

7 голосов
/ 18 марта 2010

Мы используем следующее ...

<?if $(var.ProcessorArchitecture)=x86 ?>
<Condition Message="!(loc.LaunchCondition_Error64)">
    <![CDATA[Installed OR Not VersionNT64]]>
</Condition>
<?endif?>
3 голосов
/ 17 марта 2010

Добавить это условие

<Condition Message="This is designed for 32bit OS">%PROCESSOR_ARCHITECTURE ~= "x86" AND %PROCESSOR_ARCHITEW6432 &lt;&gt; "amd64"></Condition>

Вы можете создать один установщик с 32-битным компонентом и 64-битным компонентом и поместить эти два условия в соответствующие компоненты

<Component Id="bit32Component" Guid="..." Feature="ProductFeature">
    <Condition>%PROCESSOR_ARCHITECTURE~="x86" AND %PROCESSOR_ARCHITEW6432&lt;&gt;"amd64"></Condition>
</Component>
<Component Id="bit64Component" Guid="..." Feature="ProductFeature">
    <Condition>%PROCESSOR_ARCHITECTURE~="amd64" OR %PROCESSOR_ARCHITEW6432~="amd64"></Condition>
</Component>

вот ссылка, которую я использовал

http://blogs.msdn.com/david.wang/archive/2006/03/26/HOWTO-Detect-Process-Bitness.aspx

3 голосов
/ 17 марта 2010

Элемент condition работает со свойствами установщика Windows, которые существуют во время установки.

Однако вы определяете Win64 как переменную wix, а не свойство установщика Windows. Переменные Wix существуют только во время создания установки. Вы должны ссылаться на них как $(var.MyWixVariable) там, где вы их используете, и препроцессор wix затем заменит их определенным значением.

Я бы попробовал это вместо:

<?if $(var.Platform) = "x64"?>
<?define PlatformString = "64-bit"?>
<Property Id="Win64" Value="1" />
<?else?>
<?define PlatformString = "32-bit"?>
<?endif?>

Если $(var.Platform) имеет правильное значение при создании установки, это приведет к тому, что свойство «Win64» будет записано в базе данных установщика Windows (т. Е. Файл MSI), и свойство будет доступно во время установки для использования. в элементе условия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...