1

我有一个要升级到的产品。现在我更新了 App 代码,而不是升级代码,让它作为升级工作。

到目前为止,我没有在 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="RemoveExistingProducts" 和 InstallExecuteAgain After="RemoveExistingProduct" 但没有运气。

4

2 回答 2

0

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

新的 ProductCode 和 PackageCode。相同的升级代码。增加前三位数字的 ProductVersion。

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

做一个详细的日志,看看 FindRelatedProducts 操作发生了什么,寻找关于检测到的产品的评论。

于 2014-04-18T19:55:31.993 回答
0

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

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

在构建 WIX 项目时,覆盖会引发警告。属性 ID 是“产品”标签的子标签。

正如 Mirosoft WIX 文档所说

请注意 Windows 安装程序在替换现有文件时如何应用文件版本控制规则。在尝试安装组件的任何文件之前,Windows 安装程序首先确定组件的密钥文件是否已安装。如果安装程序在目标位置找到与安装的组件的密钥文件同名的文件,它会比较两个密钥文件的版本、日期和语言,并使用文件版本控制规则来确定是否安装由包裹。如果安装程序根据密钥文件确定需要替换组件,则它使用每个已安装文件的文件版本控制规则来确定是否替换文件。

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

于 2014-04-19T10:13:11.247 回答