2009-12-03 8 views
11

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

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

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

Итак, через WiX можно определить платформу для обеспечения установки в нужном месте?

ответ

17

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

+3

В WiX 3 использование атрибута платформы не рекомендуется.Они рекомендуют оставить его и использовать вместо этого переключатель «-arch» для свечи. http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm – Chris

+0

Возможно, вам придется использовать sys.BUILDARCH вместо var.Platform. –

11

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

Тест для 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

Спасибо. Теперь вот другая проблема для WIX: Через WIX, когда я извлекаю путь установки для 64-битных компонентов, обратившись к его разделу реестра, из-за перенаправления реестра он перенаправляется в WOW6432node, где ключей реестра не существует. Итак, через WIX, есть ли какой-нибудь способ взглянуть на 64-битный просмотр реестра только с одним созданием MSI? Насколько я знаю, компонент должен быть отмечен как Win64 = «да», чтобы заставить записи реестра записываться в 64-битном кустах реестра вместо куста реестра WOW64. Любые другие предложения? – user223572

+0

Эта проблема рассматривается в решении, которое я предложил в своем ответе. – JamesD

+0

@PeterMortensen. Да. Исправлена. – eh9

2

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

candle -arch x86 

или

candle -arch x64 

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

 Смежные вопросы

  • Нет связанных вопросов^_^