Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation WIX安装程序:卸载以前的版本并安装新版本_Installation_Wix_Uninstallation_Reinstall - Fatal编程技术网

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

Installation WIX安装程序:卸载以前的版本并安装新版本,installation,wix,uninstallation,reinstall,Installation,Wix,Uninstallation,Reinstall,我有一个要升级的产品。 现在我已经更新了应用程序代码,而不是升级代码,让它作为一个升级工作 我现在还没有在WIXXML中使用MajorUpgrade标记 以下配置将卸载任何以前的配置,并将较新的文件安装到目录中,但它仅安装更改了版本号的文件 <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <Upgrade Id="$(var.SleakSoft_UpgradeCode)"> <UpgradeVers

我有一个要升级的产品。 现在我已经更新了应用程序代码,而不是升级代码,让它作为一个升级工作

我现在还没有在WIXXML中使用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”,但是没有成功。

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

新产品代码和包装代码。 相同的升级代码。 在前三位中增加ProductVersion

每个用户安装不会升级每台机器,反之亦然,而且我不认为您可以用64位更新的产品升级32位产品


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

好吧,我试过了,但目前对我有效的热修复程序是在卸载完成后强制重新安装所有东西

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

重写在生成WIX项目时抛出警告。属性ID是“产品”标记的子级

正如Mirosoft WIX文件所述

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


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

我不确定我是否遵循:您想进行重大升级,但不想使用
MajorUpgrade
?或者您想要其他类型的?@TomBlodget:我使用MajorUpdate没有问题,但由于我是WIX新手,我尝试了schedule=“afterInstallInitialize”:这实际上卸载了当前安装的版本,但只是从安装程序中安装了较新的文件。我在MajorUpgrade中使用的另一个选项是InstallFinalize之后“但我们并不期望有更多的过度行为,它只是用更高的版本替换了文件。在我的安装程序中,有一些文件具有相同的版本号,但由于它们包含一些错误修复,文件大小已被更改。我不推荐这种方法。它强制覆盖安装程序包含的目标系统上的任何文件-如果包含合并模块,则可能包含系统文件。在早期版本的Windows中,这可能会降级系统文件,而在更高版本中,可能会导致运行时错误。