WIX安装程序:卸载以前的版本并安装新版本

时间:2014-04-18 13:31:33

标签: wix install uninstall complete reinstall

我有一个产品,我正在创建升级。 现在我已经更新了应用程序代码,而不是升级代码,以使其作为升级工作。

到目前为止,我没有在WIX xml中使用MajorUpgrade标记。

以下配置将卸载以前的所有配置并将较新的文件安装到目录中,但它只安装那些已更改版本号的文件。

<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="$(var.SleakSoft_UpgradeCode)">
 <UpgradeVersion Minimum="4.12.0" Maximum="$(var.SleakSoft_AppVersion)" Property="OLDERVERSIONBEINGUPGRADED" OnlyDetect="no" IncludeMinimum="yes" IncludeMaximum="no" />
  <UpgradeVersion Minimum="$(var.SleakSoft_AppVersion)" IncludeMinimum="yes" OnlyDetect="yes" Language="!(loc.LANG)" Property="NEWPRODUCTFOUND" />
  <UpgradeVersion Minimum="4.12.0" Maximum="5.0.0" OnlyDetect="no" Language="!(loc.LANG)" IncludeMaximum="yes" Property="UPGRADEFOUND" />
</Upgrade>  
<CustomAction Id="PreventDowngrading" Error="Newer version of Sleak Talk is already installed." />
  <InstallExecuteSequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom>
  <RemoveExistingProducts After="InstallInitialize"  />
</InstallExecuteSequence>

现在,如何在删除现有产品后安装安装程序中的所有文件。

我已经尝试过InstallExecure After =&#34; RemoveExistingProducts&#34;和InstallExecuteAgain After =&#34; RemoveExistingProduct&#34;但没有运气。

2 个答案:

答案 0 :(得分:0)

正确的答案是在InstallInitialize之后,但是如果这不起作用那么你就会遇到更大的问题。例如,如果您尝试了它并且它只安装了具有更高版本的更新文件,那么您的主要升级逻辑根据定义是不正确的,因为在安装较新的产品之前将卸载旧产品。所以也许你没有检测到旧产品。假设您的MSI文件中有适当的升级检测机制,则这些是规则:

新的ProductCode和PackageCode。 相同的UpgradeCode。 在前三位数中增加ProductVersion。

并且每个用户安装不会升级每台计算机,反之亦然,我认为您不能使用64位更新的产品升级32位产品。

执行详细日志并查看FindRelatedProducts操作中发生的情况,查找有关检测到的产品的注释。

答案 1 :(得分:0)

好的,我试过了,但是现在对我有用的热修复功能是在卸载完成后强行重新安装。

<Property Id="REINSTALLMODE" Value="amus" />

覆盖在构建WIX项目时抛出警告。 Property ID是“Product”标签的子级。

正如Mirosoft WIX文档所述

  

请注意Windows Installer如何应用文件版本控制规则   何时替换现有文件。 Windows Installer首先确定   是否已经安装了组件的密钥文件   尝试安装组件的任何文件。如果   安装程序查找与组件的密钥文件同名的文件   安装在目标位置,它比较版本,日期和   两个密钥文件的语言,并使用文件版本控制规则   确定是否安装包提供的组件。如果   安装程序确定需要更换组件   密钥文件,然后它使用每个安装的文件版本控制规则   文件以确定是否替换文件。

因此别无选择,只能强行过去写。