使用WiX进行升级安装 - 使用WiX创建的旧安装程序

时间:2010-07-27 08:28:54

标签: installer wix upgrade

我在看到Wise For Windows Installer后,正在构建我的第一个WiX安装程序!

我已经构建了安装程序并且工作正常,但现在我需要让它从我以前版本的应用程序执行升级。虽然我可以找到很多关于设置WiX的帖子来执行升级,但是当你使用其他工具制作了之前的安装程序时,我找不到任何告诉我如何操作的信息。

我是否也这样做?我是否需要从旧安装程序获取升级代码等?非常感谢提前!

更新:

根据fletcher的说明,我使用dark.exe从旧安装程序获得了UpgradeCode,并将其添加到Product标签的UpgradeCode中。我的WiX文件的开头现在看起来......

<Product Id="fcdc6617-e960-46db-8faa-1dc627f250c8" Name="MyProduct"
       Language="1033" Version="1.2.0.5165" Manufacturer="MyCompany" 
       UpgradeCode="{E97A233B-AB49-4B66-B92A-68972F6D72B9}">

    <Package InstallerVersion="200" Compressed="yes" />

<!-- Upgrade from previous version(s) -->
<Property Id="PREVIOUSVERSIONINSTALLED" Secure="yes" />
<Upgrade Id="{E97A233B-AB49-4B66-B92A-68972F6D72B9}">
  <UpgradeVersion Minimum="1.1.0.4605" Maximum="1.2.0.5165"
                  Property="PREVIOUSVERSIONINSTALLED"
                  IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>

...但是现在当我运行这个安装程序时,我最终在目标机器上有两个MyProduct实例。我哪里错了?

4 个答案:

答案 0 :(得分:4)

在WiX v3.5中,还有新的MajorUpgrade元素,使所有这些创作变得更加容易。

答案 1 :(得分:2)

听起来您想要进行Windows Installer主要升级。添加Upgrade表将找到现有产品并将PREVIOUSVERSIONINSTALLED属性设置为产品代码。

要在安装过程中删除旧产品,您需要将RemoveExistingProducts操作添加到Execute序列中。您必须在此处对此进行排序有一些选择。最基本的方法是通过添加以下命令在执行序列的早期卸载旧应用程序:

<RemoveExistingProducts Before="InstallInitialize" /> 

您可以在执行序列中稍后执行删除操作,但必须更加小心组件规则。

答案 2 :(得分:1)

今天早上终于找到了一个解决方案,感谢所有指出我正确方向的人(包括DAVID GARDINER的blog)。确保升级代码与以前的安装程序相同,并且产品代码已更改且版本号已增加,这是完整的解决方案:

<Product Id="fcdc6617-e960-46db-8faa-1dc627f250c8" Name="$(var.ProductName)"
       Language="1033" Version="$(var.Version)" Manufacturer="$(var.Manufacturer)" 
       UpgradeCode="$(var.UpgradeCode)">

<Package InstallerVersion="200" Compressed="yes" />
<Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<!-- without this next line the upgrade doesn't work! (not sure why?) -->
<Property Id="ALLUSERS" Value="1" /> 

<Upgrade Id="$(var.UpgradeCode)">

  <UpgradeVersion Property='PREVIOUSVERSIONSINSTALLED' 
                  OnlyDetect="no" IncludeMinimum='yes' 
                  Minimum='1.1.0.4605' IncludeMaximum='no' 
                  Maximum='$(var.Version)' />

  <UpgradeVersion Minimum="$(var.Version)" 
                  IncludeMinimum="no" OnlyDetect="yes" 
                  Language="1033" 
                  Property="NEWERPRODUCTFOUND" />

</Upgrade>

...

<InstallUISequence>

  <Custom Action="UIandAdvertised" Sequence="3">
    ProductState=1
  </Custom>

  <LaunchConditions After="AppSearch" />
</InstallUISequence>

<CustomAction Id="PreventDowngrading" Error="Newer version of this product is already    installed." />
<CustomAction Id="UIandAdvertised" Error="Something about the UI."/>

<!-- Remove exist products before install -->
<InstallExecuteSequence>

  <Custom Action="PreventDowngrading" After="FindRelatedProducts">
    NEWERPRODUCTFOUND AND NOT Installed
  </Custom>

  <LaunchConditions After="AppSearch" />
  <RemoveExistingProducts Before="InstallInitialize" />
</InstallExecuteSequence>
</Product>

答案 3 :(得分:1)

我遇到了类似的问题,最后通过运行带有详细日志记录的安装程序来解决问题。

我的应用程序的现有安装被忽略,因为它是使用InstallScope =“per-machine”安装的,而默认值是每用户。

"FindRelatedProducts: current install is per-user.  Related install for product '{GUID}' is per-machine.  Skipping..."

要解决这个问题,我将InstallScope添加到我的包元素中:

<Package Id='*' ... InstallScope="perMachine"/>

我希望这有帮助!