Как установщики на основе WIX могут регистрировать COM как для 32-, так и для 64-разрядной ОС Windows?

У меня есть долгоживущий установщик, который использует RegistryValue для настройки COM-сервера .Net. Установщик 32-битный. Я хотел бы, чтобы настройки реестра также были установлены для 64-битных ОС. Мои исследования показывают, что для этой цели мне нужен отдельный 64-битный установщик. Хорошо, как я могу получить загрузчик, который определяет ОС и вызывает правильный 32- или 64-разрядный .msi?


person KevM    schedule 31.05.2011    source источник
comment
Я также видел упомянутую технику, в которой как 32-битные, так и 64-битные версии зависимости dll объединены в потребляющую сборку. Прежде чем сборка выполнит PInvoke, она проверяет, присутствует ли библиотека. Если нет, он извлекает соответствующую связанную dll. Это кажется безумием, но для моих целей подойдет идеально. Для будущих выпусков я могу попробовать этот путь.   -  person KevM    schedule 27.01.2012


Ответы (2)


Вам нужно будет написать загрузчик самостоятельно.

WiX не поддерживает смешанные 32/64-разрядные пакеты, потому что установщик Windows не поддерживает их. Однако некоторые коммерческие инструменты используют специальный загрузчик и 2 файла MSI для обработки смешанного установщика.

person cosmin    schedule 01.06.2011
comment
Я не хотел принимать этот ответ, но я изучил Burn в Wix 3.6, но, похоже, он не позволяет использовать пользовательский интерфейс ваших встроенных MSI. Для моих целей на данный момент это не работает. Так что, к сожалению, мне действительно придется создать свой собственный Bootstrapper. Изучите Burn, чтобы узнать, подходит ли он вам. - person KevM; 03.06.2011
comment
WiX поддерживает 32- и 64-битные пакеты: jpassing.com/2009/10/09/ Проверьте ответ @Thomas Schlaefer. - person Jorge Fuentes González; 03.01.2013

У меня была такая же проблема с настраиваемым расширением Windows Shell Overlay Extension, которое должно предоставлять 32-битную Dll для 32-битной Windows и 64-битную Dll для 64-битной Windows. Мой 32-разрядный файл msi записывал только записи реестра в узел WoW6432 в 64-разрядной системе, поэтому расширение оболочки не работало.

Решение (протестировано с wix-3.5.2519.0 на Win7 x86 и x64):

  1. Создайте два компонента: один будет установлен только в 32-битной системе, а другой будет установлен только в 64-битной системе.
  2. Используйте элемент «Condition» внутри каждого компонента, чтобы проверить разрядность операционной системы. Я использовал Msix64, он также может работать с VersionNT64 ...
  3. Для 64-разрядного компонента атрибут Win64 должен иметь значение «да».
  4. К сожалению, это не сработает из коробки, потому что light.exe выдает ошибку (ошибка LGHT0204: ICE80: этот пакет содержит 64-битный компонент, но свойство сводки шаблона не содержит Intel64 или x64.):
  5. Решение - запустить light.exe с отключенной проверкой ICE80 (используйте параметр -sice: ICE80). Теперь будет создан файл msi, который можно будет использовать на обеих платформах.

Пример:

<Component Id="shellext_32.dll" DiskId="1" Guid="YOUR-GUID1">
    <!-- this will be installed only on a 32-bit System-->
    <Condition><![CDATA[NOT Msix64]]></Condition> 
    <!-- copy 32-bit Dll file...-->
    <File Id="blah blah... />

    <RegistryKey Id="MyShellIconOverlay" Root="HKLM"Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\MyIconOverlay" Action="createAndRemoveOnUninstall">
        <RegistryValue Type="string" Value="{GUID...}" />
    </RegistryKey>
</Component>

<Component Id="shellext_64.dll" DiskId="1" Guid="YOUR-GUID2" Win64="yes">
    <!-- this will be installed only on a 64-bit System-->
    <Condition><![CDATA[Msix64]]></Condition> 
    <!-- copy 64-bit Dll file...-->
    <File Id="blah blah... />

    <!-- the following Registry Key will NOT be created inside the WoW6432 
    <RegistryKey Id="MyShellIconOverlay64" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\MyIconOverlay64" Action="createAndRemoveOnUninstall">
        <RegistryValue Type="string" Value="{GUID...}" />
    </RegistryKey>
</Component>

Использованная литература:

person Thomas Schlaefer    schedule 22.11.2011
comment
Спасибо! Я добрался до ICE80, но не понимал, что он будет работать, если его подавить :-) - person Cameron; 23.04.2014