Wix刻录升级需要在升级之前卸载两个MSI

时间:2013-05-16 21:45:28

标签: wix bootstrapper burn

我有两个MSI; framework.msiproduct.msiframework.msi将dll安装到product.msi依赖于安装和卸载的GAC中。

我创建了一个将两个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引用了不再是版本的程序集(CheckInstaller)在GAC中(因为它已作为framework.msi升级的一部分进行了升级)。

无需编写自定义BA,我希望能够做到这样的事情:

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

我意识到,如果我们将两个MSI合并为一个大产品,但由于我们将framework.msi分散到其他团队并且出于各种其他原因,他们需要保持独立。

我想做甚至可能与WiX引导程序有关吗?

1 个答案:

答案 0 :(得分:3)

今天烧伤是不可能的。链是固定的。在安装时它会向前运行,在卸载时会向后运行。我想到今天有两种选择:

  1. 当新的Bundle卸载旧的Bundle时,不要让MSI相互升级并删除旧的MSI。

  2. 避免在包之间创建安装时依赖关系。无论如何,这通常是件好事。

  3. 功能请求可能是让新的Bundle能够在安装之前删除旧的Bundle 而不是之后的,就像今天一样,但这不是目前支持。