У меня была такая же проблема с пользовательским расширением оболочки Windows, которое должно предоставлять 32-битную DLL для 32-битной Windows и 64-битную DLL для 64-битной Windows. Мой 32-разрядный MSI-файл будет записывать только записи реестра на узел WoW6432 в 64-разрядной системе, поэтому расширение оболочки не работает.
Решение (протестировано с wix-3.5.2519.0 на Win7 x86 и x64):
- Создайте два компонента, один из которых будет установлен только в 32-разрядной системе, а другой - только в 64-разрядной системе.
- Используйте элемент «Condition» внутри каждого компонента, чтобы проверить битность операционной системы. Я использовал Msix64, он также может работать с VersionNT64 ...
- Для 64-битного компонента должен быть установлен атрибут Win64 «да».
- К сожалению, это не будет работать успешно из коробки, потому что light.exe выдает ошибку (ошибка LGHT0204: ICE80: этот пакет содержит 64-битный компонент, но свойство сводки шаблона не содержит Intel64 или x64.):
- Решением является запуск 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>
Ссылки: