windows 为什么可以使用相同的升级代码安装两个MSI?

von4xj4u  于 2022-11-30  发布在  Windows
关注(0)|答案(1)|浏览(194)

多年来,我一直使用WixSharp构建MSI,this rule的基本内容是:
对于应用程序的每个新版本,请更改ProductCode,但切勿更改UpgradeCode
这总是完美的工作,但最近我发现,安装一个较新版本的应用程序并没有取代以前的版本,而是得到并行安装。
在测试机器上运行this PowerShell script会得到以下结果:

我的问题
MSI文件在安装时不替换具有相同UpgradeCode的现有文件的原因是什么?

更新/解决方案

我终于解决了这个问题。基本上我做了以下几件事:
1.从我的安装名称中删除了版本字符串(因为MSI似乎也比较名称来检查是否可以升级;似乎只有相同的名称才合适)
1.将我的版本号从4位改为3位,如Christopher pointed out。也就是说,我现在正在递增,如"1.0.0"到"1.0.1"等。
1.将以下代码添加到我的WixSharp ManagedProject示例中:

InstallScope = InstallScope.perMachine,
MajorUpgradeStrategy = new MajorUpgradeStrategy
{
    UpgradeVersions = VersionRange.OlderThanThis,
    PreventDowngradingVersions = VersionRange.NewerThanThis,
    NewerProductInstalledErrorMessage = "Newer version already installed.",
    RemoveExistingProductAfter = Step.InstallInitialize
},

进行这些更改后,升级成功。

tquggr8v

tquggr8v1#

条件约束是ProductCode,而不是UpgradeCode。每个ProductCode只能安装1个MSI。如果再次尝试这样做,将会执行维护作业、小型更新或次要更新。
许多MSI可以共享一个UpgradeCode。(虽然不是一个好的做法!)例如,您根本不需要编写一个Major Upgrade。
这里通常的原因是你必须改变前三个字段的版本号,并且每次安装都必须在相同的上下文中(每用户和每用户或者每机器和每机器)。顺便说一句,这是另一种安装相同ProductCode两次的方法。每用户一次,每机器一次。同样不是一个好的做法。
好的:
1.0.0 → 1.0.1查找1.0.1 MSI中的相关产品将看到1.0.0并通知RemoveExistingProducts删除它。
1.0.0 → 1.0.0 or 1.0.0.0 → 1.0.0.1 Bad. FindRelated will see it as the same version and not remove it.

相关问题