2009-12-17 58 views
17

我使用基於WIX的安裝程序。如何實現32&64平臺的單個安裝程序

安裝程序分別構建到32和64平臺。這兩個平臺的安裝程序版本非常相似,但很少有條件步驟,例如避免在32位安裝程序中註冊x64本地dll。

有沒有辦法將兩個安裝程序聯合爲一個?

回答

27

這是無法完成的。這是Windows Installer的一個限制,如果你想做到這一點而不是兩倍,那麼你需要兩個MSI的外部CAB文件和一個引導程序來執行正確的安裝。如果不需要MSI,請嘗試NSIS。您可以很容易地基於OS架構進行條件安裝。

反正this has been also asked on the WiX-users list在最近幾周多次,我能找到的最好的迴應是這樣的一個布萊爾:

的MSI標記爲64位,根本不會在32位系統上安裝。沒有什麼 你可以做。

標記爲32位的MSI根本無法將文件放入「64位目錄」 (它們將被重定向到32位「等同」文件夾)。沒什麼可以 做的。

MSI不能標記爲32位和64位。也沒有什麼可以做的。

「正確的」方法是生成兩個MSI,一個用於32位平臺,另一個用於64位平臺。他們可以共享相同的外部駕駛室文件,​​如果您需要將它們運輸到一起以節省空間,則需要 。如果你這樣做,你可以使用一個 引導程序來提取適合你的CAB並安裝它。

+1

謝謝sascha,這非常有幫助! NSIS看起來很酷,我希望我知道如果以前,它可以讓我們更簡單的安裝:) – Elisha 2009-12-19 07:37:54

+0

這不完全是真的......我試圖安裝在System32文件夾上使用x86編譯在64位操作系統上,它總是將這些庫複製到64位文件夾而不是32文件夾中。所以它不會自動重定向... – Sonhja 2014-04-09 08:51:13

1

我對WiX說得不夠了解,但有傳聞證據表明這不被推薦。我想起了我看到的所有下載(MSDN和許多其他),您必須在32位和64位安裝程序之間進行選擇。其實現在我想到了它,我從未見過也沒有聽說過「通用安裝程序」。

+0

感謝您的回答。我同意大多數安裝程序都有分離的版本,你知道爲什麼嗎?用戶減少後顧之憂是有益的。我仍然很想知道這是否可能。 – Elisha 2009-12-17 15:11:05

+0

我認爲最可能的原因是很少有文件在32位和64位版本之間共享,所以組合安裝程序至少是兩倍。所以 - 這是可能的,但如果您需要64位,則需要下載32位文件將會很不方便,反之亦然。 – 2009-12-17 15:38:21

3

在某種程度上是可能的。不過,你無法單獨使用微星。這方面的一個例子是Microsoft的.NET安裝包; 「完全安裝」包具有x86位,x64位和ia64支持。但是,此安裝程序使用引導過程來執行此操作;它有一個單獨的程序,確定要安裝的內容,然後安裝它。在下面,您仍然需要32位MSI和64位MSI軟件包。

雖然被警告;然後安裝程序引導程序的體系結構將確定它可以安裝的內容。如果它是基於x86的引導程序,那麼它只能在安裝了WOW64的32位窗口和64位窗口(Win2k8 R2的可移動選項)上運行,並且在ia64平臺上可能根本無法運行!

提供單獨的安裝程序確實非常簡單,因此捆綁它們真的不值得。您會將安裝程序大小加倍或增加三倍,這可能會關閉一些客戶。如果它是一個內部工具,那麼真的沒有任何缺點 - 可用的原始msi允許有更多(遠程)安裝選項。

簡而言之:是的,你可以,但不能與MSI。

1

您可以嘗試在組件的條件標籤中使用PROCESSOR_ARCHITECTURE環境變量,以僅註冊到特定體系結構需要註冊的內容,這將在MSI運行時適用...不適用於構建時。

例檢測64位操作系統:

<Component Id="..." Guid="PUT-GUID-HERE"> 
    <Condition>NOT(%PROCESSOR_ARCHITECTURE = "x86")</Condition> 
    ... 
</Component> 


例檢測32位操作系統:

<Component Id="..." Guid="PUT-GUID-HERE"> 
    <Condition>%PROCESSOR_ARCHITECTURE = "x86"</Condition> 
    ... 
</Component> 


如果您想了解更多關於MSI引用的環境變量看本頁:http://msdn.microsoft.com/en-us/library/windows/desktop/aa368012(v=vs.85).aspx#Access_Prefixes

關於究竟PROCESSOR_ARCHITECTURE將在何種情況下返回更多信息,請參見本頁面:https://superuser.com/q/396267/117857

然而,在這個答案的評論指出,這可能不是真正的你在找什麼。但我認爲(未驗證)您可以創建一個包含32位和64位MSI的引導程序,然後讓引導程序根據操作系統體系結構選擇在運行時應用哪個MSI,儘管我沒有嘗試過這種方法,不知道該怎麼做,如果我發現,我一定會發布答案。

+1

這不會讓您在32位軟件包中混合使用64位和32位組件。這是一個MSI規則/限制。 – 2013-02-08 00:45:41

+0

@BobArnson嗯,它似乎是我所發現的最接近它的東西。 – bsara 2013-02-08 18:35:26

相關問題