Installshield主要升级不会卸载旧版本

Noa*_*oam 3 windows-installer installshield version

我有一个Installshield项目.

我加了一个重大的升级项目和改变Product version,Product codePackage code.

使用新安装程序安装后,旧版本仍然存在(中Add / Remove)

我认为这与我的旧版本编号是1.0.4.23新版本的事实有关1.0.4.24- 这是一个问题吗?主要升级是否忽略版本属性中的这么小的变化?

在主要升级common选项卡中我选择了Any earlier version

我记得多年前做的版本号1.11.2一切都很好,这是我怀疑当前问题与版本号有关的主要原因.

zet*_*t42 5

我认为这与我的旧版本号是1.0.4.23而新版本是1.0.4.24这一事实有关 - 这是一个问题吗?主要升级是否忽略版本中的这么小的变化?

是的,只有版本号的前三个字段对于主要升级才有意义.第四个字段被忽略了.

这在主要升级MSDN页面的说明中说明.

如果要触发主要升级,则新版本号必须为1.0.5.0或更高.


编辑:

正如Christopher Painter所指出的那样:

如果你必须使用所有四个字段,有一种解决方法.您可以创建一个自定义操作来执行您自己的FindRelatedProducts实现,并使用RemoveExistingProducts然后处理的ProductCode设置action属性.

自定义操作可以像这样实现:

  1. 致电MsiGetProperty获取产品的UpgradeCode.
  2. 要求MsiEnumRelatedProducts()枚举与您的产品具有相同UpgradeCode的所有产品.
  3. 调用MsiQueryProductState()以验证返回的产品是否MsiEnumRelatedProducts()已实际安装.我遇到了一些MsiEnumRelatedProducts()不再安装退回的孤立产品的情况.因此,通过仔细检查安装状态,代码将更加健壮MsiQueryProductState().
  4. 打电话MsiGetProductInfo()INSTALLPROPERTY_VERSIONSTRING作为参数szProperty参数查询已安装的产品的版本.不要使用INSTALLPROPERTY_VERSION,因为INSTALLPROPERTY_VERSION只从版本号的前三个字段派生,我们要避免的问题.
  5. 比较版本号时,请确保不仅仅比较字符串,而是将字符串解析为由"."分隔的字段.并单独比较字段.
  6. 如果找到要替换的匹配产品,请调用MsiSetProperty()ActionProperty设置为该产品的ProductCode,RemoveExistingProducts然后对其进行操作.

  • @ChristopherPainter我已经添加了可能实现这种自定义操作的步骤. (2认同)