2 回答

TA貢獻1873條經驗 獲得超9個贊
大型升級失?。寒斈凇疤砑?刪除程序”中看到兩個條目時,大型升級失敗了(通常)。您需要修復 Upgrade表的配置。請參閱下面列出的可能原因。
最小WiX標記:默認升級表的最小WiX標記-具有正常參數(效果很好,請參見下面的屏幕截圖)-只是:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
進階:甚至可以將上述用于簡單主要升級配置的“便利元素”與舊樣式元素組合在一起,以完全控制升級表的內容。樣品在這里。
關于主要升級:MajorUpgrade和Upgrade元素。如何使用它們:
如何避免在Windows Installer / MSI中安裝兩個版本的產品?
在MSI UpgradeTable中添加條目以刪除相關產品
可能的原因:重大升級失敗的許多可能原因的簡短摘要。
升級代碼不匹配:MSI的新舊版本之間的升級代碼可能不匹配,因此這些產品未標識為相關。此后應保留兩個版本(從未發生過卸載舊版本)。
缺少升級代碼:只需添加一下,Product元素中就有可能缺少升級代碼。通常這是一個錯誤,除非您想做一些特別奇怪的事情。
Missing MajorUpgrade元素:可能缺少整個Major Upgrade元素,并且不存在Upgrade元素。后者用于主要升級的手動配置,前者用于典型主要升級方案的“自動魔術”實施。某種“最佳實踐”。
ProductVersion:產品版本中的前3個數字可能沒有一個或多個(第四個字段被忽略)。
產品代碼:作為一個旁注,您可能會收到一條警告,指出已安裝該產品,這表示該產品代碼未更改(應進行重大升級)。
懸掛的版本:您的WiX標記也可能不錯,并且懸掛的舊版本從未正確配置,如果這樣,請手動將其卸載,然后重試或嘗試使用干凈的虛擬機。如果自動生成產品GUID,則在主要升級設置不正確的情況下,最終可以同時安裝多個版本的產品。
安裝上下文:MSI文件可以按用戶或按計算機安裝。如果按用戶安裝,然后按計算機安裝,它將不會檢測到以前的版本。您的軟件包中是否有對ALLUSERS的硬編碼引用?
SecureCustomProperties:很快-我記得-在安全環境(企業環境中運行的用戶沒有管理員權限)中,您需要將“升級”表中的ACTION屬性添加到安全屬性列表中(允許傳遞給延遲模式的屬性)。
軟件包代碼:我看到的一個非常特殊的情況是,新軟件包與舊軟件包具有相同的軟件包代碼(或現有的已安裝軟件包)。這是一個極端的設計錯誤,絕不會發生。始終自動生成程序包代碼,這是正確的操作方式。Windows Installer會按照定義將這兩個程序包視為相同(與實際情況相反)。
更多詳細信息:還有一些需要記住的事情:
本質上,主要的升級是卸載舊版本并安裝新版本,并為操作發生的順序提供許多計劃選項(先安裝新版本,然后卸載舊版本,反之亦然)。
如上所述,您還可能在包裝盒上安裝了錯誤的較舊版本,但配置不正確,或者發生了一些X-Files廢話,導致升級失敗。發生。
WiX不太可能,但是InstallExecuteSequence中可能缺少標準操作RemoveExistingProducts。
WiX學習曲線:建議使用一些示例來幫助加快學習過程。唯一真正有用的東西嗎?以下是一些WiX快速入門建議。那里有示例鏈接。
最少的WiX樣本:有一個舊樣本:透明鋁。從本質上講解了如何使用 Votive創建基于WiX的安裝程序。它包括一個主要的升級元素。我相信這種簡單的配置可以為您尋求的降級提供保護:
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
請參閱以下升級表:
逆戟鯨
測試用例:使用透明鋁作為測試項目,您可以嘗試以下過程來使升級工作:
將產品代碼設置為*,以便為每個版本(“ <Product Id="*" ...")自動生成一個新的ProductCode 。
編譯您的MSI的第一個版本。在解決方案視圖中的WiX項目上單擊鼠標右鍵,然后Visual Studio選擇Open Folder in File Explorer。進入bin和Debug或Release。
通過在文件名的末尾添加_1重命名已編譯的MSI。例如:MySetup_1.msi
現在,在WiX來源中增加產品版本字段的前3位數字之一: <Product Id="*" ... Version="2.0.0"
編譯一個新的MSI并將其重命名:MySetup_2.msi
從版本1開始安裝MSI文件,然后再安裝第二個版本。驗證主要升級是否成功。
進階:這是一個演示便捷方式的高級演示,它結合使用了便利元素"MajorUpgrade"和較舊的"Upgrade"元素(可以對生成的升級表進行更細粒度的控制)來配置主要升級:
在MSI UpgradeTable中添加條目以刪除相關產品
這里是僅使用較舊的Upgrade元素導致更多工作的示例,但完全控制了Upgrade表:Major Upgrade-“ The Old,Manual Way”。

TA貢獻1784條經驗 獲得超2個贊
這是正確的,這在MSI SDK文檔中有所說明(您閱讀并仍然詢問嗎?)。另外:答案也為其他人而寫-用于通用。重新表述以前寫過的內容是一項練習和一項實驗,以查看是否可以使它變得更好。
- 2 回答
- 0 關注
- 988 瀏覽
添加回答
舉報