2013-05-16 235 views
2

我有兩個MSI; framework.msiproduct.msiframework.msi將dll安裝到GAC中,product.msi依賴於安裝和卸載。Wix刻錄升級需要在升級前卸載兩個MSI's

我創建了一個將兩個MSI連接在一起的BA。

<Bundle ...> 
    <Chain> 
    <PackageGroupRef Id='framework'/> 
    <PackageGroupRef Id='product'/> 
    </Chain> 
</Bundle> 
<Fragment> 
    <PackageGroup Id="framework"> 
    <MsiPackage Name="Product Framework" 
       ForcePerMachine="yes" 
       SourceFile="framework.msi" 
       Vital="yes" 
       Cache="no" 
       Permanent="no" 
       Compressed="yes" 
       Visible="yes"/> 
    </PackageGroup> 
    <PackageGroup Id="product"> 
    <MsiPackage Name="Product" 
       ForcePerMachine="yes" 
       SourceFile="product.msi" 
       Vital="yes" 
       Cache="no" 
       Permanent="no" 
       Compressed="yes" 
       Visible="yes"/> 
    </PackageGroup> 
</Fragment> 

對於全新安裝,我framework.msiproduct.msi正確安裝。當我升級到新版本時,它會成功升級framework.msi。然後,它繼續卸載product.msi,但它失敗(對於此錯誤:System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.FileNotFoundException: Could not load file or assembly 'CheckInstaller, Version=1.0.0.0' or one of its dependencies. The system cannot find the file specified.),因爲卸載程序CustomAction引用了GAC中不再存在的程序集版本(CheckInstaller)(因爲它已升級爲framework.msi升級的一部分) 。

而不必編寫自定義BA,我希望能夠做這樣的事情:

// pseudo code 
if(product.Exists() && framework.Exists()) 
{ 
    product.Uninstall(); // product is dependent on the framework 
    framework.Uninstall(); 
} 
framework.Install(); 
product.Install(); 

我意識到這將是可能的,如果我們兩個微星的合併成一個大的產品,但由於我們將framework.msi分散給其他團隊,由於各種其他原因,他們需要保持分開。

我想甚至可以用WiX引導程序做什麼?

回答

3

今天燒傷是不可能的。鏈條是固定的。在安裝時,它通過向前運行,在卸載時向後運行。我能想到的兩種選擇可利用的今天:

  1. 不要有MSI的升級相互讓當新的軟件包卸載舊的包老的MSI被刪除。

  2. 避免在軟件包之間創建安裝時間依賴關係。無論如何,這通常是件好事。

一種功能要求可能是有新的軟件包必須安裝後之前刪除舊的包而不是今天像它的能力,但不是在這個時間點支持。