为了账号安全,请及时绑定邮箱和手机立即绑定

WIX不会卸载旧版本

WIX不会卸载旧版本

心有法竹 2020-02-02 15:16:22
经过一番谷歌搜索后,我想到了一个配置,该配置应允许我仅安装软件包的较新版本(确实如此),而替换已安装的较旧版本(却没有)。我的wxs文件如下:<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">    <Product Id="*"             Name="Gdml File Viewer" Language="1033"             UpgradeCode="5fb07c15-32a5-4b8a-9794-e4425bfc2eea"             ...>        <Package InstallerVersion="200"                 Compressed="yes"                 InstallScope="perMachine" Platform="x64" />        <MajorUpgrade Schedule="afterInstallValidate"                      DowngradeErrorMessage="A later version of [ProductName] is already installed"                 AllowSameVersionUpgrades="no"                 AllowDowngrades="no" />...正如预期的那样,它确实允许我安装较新的版本,但未卸载较旧的版本。它仍然显示在“应用和功能”列表中:
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

大型升级失败:当您在“添加/删除程序”中看到两个条目时,大型升级失败了(通常)。您需要修复 Upgrade表的配置。请参阅下面列出的可能原因。


最小WiX标记:默认升级表的最小WiX标记-具有正常参数(效果很好,请参见下面的屏幕截图)-只是:


<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

进阶:甚至可以将上述用于简单主要升级配置的“便利元素”与旧样式元素组合在一起,以完全控制升级表的内容。样品在这里。


关于主要升级:MajorUpgrade和Upgrade元素。如何使用它们:


如何避免在Windows Installer / MSI中安装两个版本的产品?

在MSI UpgradeTable中添加条目以删除相关产品

可能的原因:重大升级失败的许多可能原因的简短摘要。


升级代码不匹配:MSI的新旧版本之间的升级代码可能不匹配,因此这些产品未标识为相关。此后应保留两个版本(从未发生过卸载旧版本)。


缺少升级代码:只需添加一下,Product元素中就有可能缺少升级代码。通常这是一个错误,除非您想做一些特别奇怪的事情。


Missing MajorUpgrade元素:可能缺少整个Major Upgrade元素,并且不存在Upgrade元素。后者用于主要升级的手动配置,前者用于典型主要升级方案的“自动魔术”实施。某种“最佳实践”。


ProductVersion:产品版本中的前3个数字可能没有一个或多个(第四个字段被忽略)。


产品代码:作为一个旁注,您可能会收到一条警告,指出已安装该产品,这表示该产品代码未更改(应进行重大升级)。


悬挂的版本:您的WiX标记也可能不错,并且悬挂的旧版本从未正确配置,如果这样,请手动将其卸载,然后重试或尝试使用干净的虚拟机。如果自动生成产品GUID,则在主要升级设置不正确的情况下,最终可以同时安装多个版本的产品。


安装上下文:MSI文件可以按用户或按计算机安装。如果按用户安装,然后按计算机安装,它将不会检测到以前的版本。您的软件包中是否有对ALLUSERS的硬编码引用?


SecureCustomProperties:很快-我记得-在安全环境(企业环境中运行的用户没有管理员权限)中,您需要将“升级”表中的ACTION属性添加到安全属性列表中(允许传递给延迟模式的属性)。


软件包代码:我看到的一个非常特殊的情况是,新软件包与旧软件包具有相同的软件包代码(或现有的已安装软件包)。这是一个极端的设计错误,绝不会发生。始终自动生成程序包代码,这是正确的操作方式。Windows Installer会按照定义将这两个程序包视为相同(与实际情况相反)。


更多详细信息:还有一些需要记住的事情:


本质上,主要的升级是卸载旧版本并安装新版本,并为操作发生的顺序提供许多计划选项(先安装新版本,然后卸载旧版本,反之亦然)。


如上所述,您还可能在包装盒上安装了错误的较旧版本,但配置不正确,或者发生了一些X-Files废话,导致升级失败。发生。


WiX不太可能,但是InstallExecuteSequence中可能缺少标准操作RemoveExistingProducts。


WiX学习曲线:建议使用一些示例来帮助加快学习过程。唯一真正有用的东西吗?以下是一些WiX快速入门建议。那里有示例链接。


最少的WiX样本:有一个旧样本:透明铝。从本质上讲解了如何使用 Votive创建基于WiX的安装程序。它包括一个主要的升级元素。我相信这种简单的配置可以为您寻求的降级提供保护:


<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

请参阅以下升级表:


逆戟鲸


测试用例:使用透明铝作为测试项目,您可以尝试以下过程来使升级工作:


将产品代码设置为*,以便为每个版本(“ <Product Id="*" ...")自动生成一个新的ProductCode 。

编译您的MSI的第一个版本。在解决方案视图中的WiX项目上单击鼠标右键,然后Visual Studio选择Open Folder in File Explorer。进入bin和Debug或Release。

通过在文件名的末尾添加_1重命名已编译的MSI。例如:MySetup_1.msi

现在,在WiX来源中增加产品版本字段的前3位数字之一: <Product Id="*" ... Version="2.0.0"

编译一个新的MSI并将其重命名:MySetup_2.msi

从版本1开始安装MSI文件,然后再安装第二个版本。验证主要升级是否成功。

进阶:这是一个演示便捷方式的高级演示,它结合使用了便利元素"MajorUpgrade"和较旧的"Upgrade"元素(可以对生成的升级表进行更细粒度的控制)来配置主要升级:


在MSI UpgradeTable中添加条目以删除相关产品


这里是仅使用较旧的Upgrade元素导致更多工作的示例,但完全控制了Upgrade表:Major Upgrade-“ The Old,Manual Way”。


查看完整回答
反对 回复 2020-02-02
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

这是正确的,这在MSI SDK文档中有所说明(您阅读并仍然询问吗?)。另外:答案也为其他人而写-用于通用。重新表述以前写过的内容是一项练习和一项实验,以查看是否可以使它变得更好。

查看完整回答
反对 回复 2020-02-02
  • 2 回答
  • 0 关注
  • 715 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信