2011-05-31 85 views
5

我有一個長期居住的安裝程序,它使用RegistryValue來設置.Net COM服務器。安裝程序是32位。我希望將註冊表設置也設置爲64位操作系統。我的研究表明,我需要爲此目的有一個單獨的64位安裝程序。那麼我怎麼能有一個引導程序來檢測操作系統並調用正確的32位或64位.msi?基於WIX的安裝程序如何爲32位和64位Windows操作系統進行COM註冊?

+0

我也看到提到技術,其中DLL的32個64位版本依賴關係被捆綁在內消耗組件。在程序集執行PInvoke之前,它會查看庫是否存在。如果不是,它會提取合適的捆綁DLL。 這似乎很瘋狂,但對我而言,完美無缺。對於將來的版本,我可以嘗試這個路線。 – KevM 2012-01-27 15:18:02

回答

4

你需要自己編寫引導程序。

WiX不支持混合的32/64位軟件包,因爲Windows Installer不支持它們。但是,某些商業工具使用自定義引導程序和2個MSI文件來處理混合安裝程序。

+0

我不想接受這個答案,但我研究了Wix 3.6中的Burn,但它似乎不允許嵌入式MSI的UI。對於我目前來說這是行不通的。很遺憾,我確實需要創建自己的Bootstrapper。看看燒傷,看看它是否適合你。 – KevM 2011-06-03 18:41:11

+1

WiX確實支持32/64位軟件包:http://jpassing.com/2009/10/09/mixing-32-and-64-bit-components-in-a-single-msi/檢查@Thomas Schlaefer的回覆。 – 2013-01-02 22:44:22

10

我有一個自定義Windows Shell覆蓋擴展的問題,它必須爲32位Windows提供32位Dll,併爲64位Windows提供64位Dll。我的32位msi文件只會將註冊表項寫入64位系統上的WoW6432節點,因此外殼擴展不起作用。

  1. 創建兩個組件,一個將僅在一個32位的系統,而另一個只能在一個安裝安裝:

    的溶液(用維克斯-3.5.2519.0上Win7的x86和x64測試) 64位系統。

  2. 在每個組件內使用'Condition'元素來檢查操作系統的位數。我使用Msix64,它可能也適用於VersionNT64 ...
  3. 64位組件必須將Win64屬性設置爲「是」。
  4. 不幸的是,這將不能成功開箱,因爲light.exe引發錯誤(錯誤LGHT0204:ICE80:該軟件包包含64位組件,但模板摘要屬性不包含Intel64或x64。):
  5. The解決方案是在禁用ICE80檢查的情況下運行light.exe(使用參數-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> 

參考文獻:

+0

謝謝!我得到了儘可能ICE80,但沒有意識到它會工作,如果被壓制:-) – Cameron 2014-04-23 13:23:47

相關問題