2015-04-02 124 views
0

如果安裝了同一產品的多個版本,是否可以使用屬性檢查新版本並添加條件消息並防止卸載?卸載前檢查更新版本 - WIX

  • 網頁1.0.0 - 基本文件(MajorUpgrade)
  • 網頁1.0.1 - 小更新文件
  • 網頁1.1.0 - 基本文件(MajorUpgrade)

使用案例: WebSite 1.0.0和WebSite 1.0.1都使用MSI軟件包安裝在網絡服務器上。當WebSite 1.0.0被卸載時,如果存在更新的版本,我需要能夠防止這種情況。

我考慮過使用條件,但不知道這是否是最好的方法。

<Condition Message="Newer version of the product must be removed"> 
    Installed OR PRODUCTVERSION > 1.0.0 
</Condition> 

安裝WebSite 1.1.0時,它將刪除以前的版本,因爲它具有所需的基本文件集。

+0

如果您需要阻止手動卸載1.0.0,那麼您需要搜索(說)在更高版本中存在的組件ID。或者您需要更高版本來創建1.0.0可以提前知道的註冊表項並在卸載期間進行搜索。主要升級搜索找不到任何內容,因爲它在卸載期間不運行。您需要搜索,組件,註冊表或1.0.0知道的更新版本。然後在啓動條件中使用該屬性來防止卸載。我假設你的字面意思是「防止卸載」的1.0.0,它沒有錯別字。 – PhilDW 2015-04-03 18:23:51

+0

好的,這是一個很好的建議。是的,我的意思是防止卸載。你能用註冊表例子寫出一個答案,這樣我就可以正確標記了嗎? – Jerode 2015-04-06 13:55:07

回答

1

如果您需要阻止1.0.0的手動卸載,那麼您需要搜索(比如說)只存在於更高版本中的組件ID,並且您需要知道它們在舊版本中的含義所以舊版本可以預測未來。或者您需要更高版本來創建1.0.0可以提前知道的註冊表項並在卸載期間進行搜索。主要升級搜索找不到任何內容,因爲在卸載過程中,主要升級FindrelatedProducts搜索無法運行。您需要搜索,組件,註冊表或1.0.0知道的更新版本。然後在啓動條件中使用該屬性來防止卸載。

另一種可能性是在升級代碼上調用MsiEnumrelatedProducts()或等效的自定義操作。這將返回一系列可以調用MsiGetProductInfo()獲取產品版本的ProductCodes,然後檢查相關的值。這具有以下優點:較舊的產品不需要事先知道註冊表項或組件Id,因爲升級代碼更具可預測性並且它們在一系列產品中更不可能改變。

2

MajorUpgrade元素用1屬性處理所有這些。

<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 

如果您使用的是IsWiX(CodePlex)項目模板,則默認情況下會創作該模板。這個想法是覆蓋最常見的需求和用例,所以你甚至不知道你首先遇到了問題。

+0

好的,我會再試一次。我試過這個用例,我可以刪除WebSite 1.0.0和WebSite 1.0.1仍然安裝。我很快接觸基地。 – Jerode 2015-04-02 20:15:32

+0

我沒有通過使用MajorUpgrade標籤運行,並沒有得到預期的結果。 MajorUpgrade將在安裝時刪除以前安裝的產品,這不是我需要的結果。對於文件更新,我需要保留原始文件。 – Jerode 2015-04-02 23:29:49

+0

MajorUpgrade還可以使用DetectOnly屬性檢測產品。 DowngradeErrorMessage作者就是這樣。 – 2015-04-02 23:33:07