Идентификация платформы в WiX 3.0 - PullRequest
11 голосов
/ 03 декабря 2009

У меня возникают проблемы при переносе управляемого кода с платформы x86 на x64. У меня есть проект WiX для создания MSI , который будет выполняться через Bootstrapper.

На платформе x86 файлы копируются в «Program Files» в соответствии с файлом Project.wxs. Но если тот же MSI установлен на платформе x64 через Bootstrapper, все установочные файлы по умолчанию копируются в «Program Files (x86)», и функциональность приложения не работает, так как не удается найти необходимые файлы в иерархии 12-hive Программные файлы (для 64-разрядных это «C: \ Program Files \ Общие файлы \ Microsoft Shared \ расширения веб-сервера \ 12 \ CONFIG»).

Я пытался использовать переменные препроцессора, такие как <? If $ (var.ProcessorArchitecture) = x64?>, Но мне нужно жестко закодировать эту переменную в свойстве проекта в x86 или x64. Наконец, я получаю два разных MSI для двух разных платформ, что для меня нежелательно.

Итак, можно ли с помощью WiX идентифицировать платформу для установки в нужном месте?

Ответы [ 3 ]

17 голосов
/ 07 декабря 2009

Я не верю, что у вас будет один 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 .

11 голосов
/ 31 декабря 2009

Вы можете использовать оператор условия (документация здесь ), который будет определять, на какой платформе работает установщик во время установки. Это позволяет вам создать только один установщик, который будет работать на всех платформах.

Тест для 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>
2 голосов
/ 23 августа 2012

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

candle -arch x86 

или

candle -arch x64 

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

...