Идентификация платформы в 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 можно ли определить платформу для обеспечения установки в нужном месте?

Ответ 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.

Ответ 2

Вы можете использовать инструкцию 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>

Ответ 3

Вы можете использовать

candle -arch x86 

или

candle -arch x64 

и в результате будут созданы атрибуты Platform="x64" и Win64="true".