我有一个产品,我正在创建升级。 现在我已经更新了应用程序代码,而不是升级代码,以使其作为升级工作。
到目前为止,我没有在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;但没有运气。
答案 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首先确定 是否已经安装了组件的密钥文件 尝试安装组件的任何文件。如果 安装程序查找与组件的密钥文件同名的文件 安装在目标位置,它比较版本,日期和 两个密钥文件的语言,并使用文件版本控制规则 确定是否安装包提供的组件。如果 安装程序确定需要更换组件 密钥文件,然后它使用每个安装的文件版本控制规则 文件以确定是否替换文件。
因此别无选择,只能强行过去写。