Installshield 重大升级不会卸载旧版本

Installshield major upgrade doesn't uninstall old version

我有一个 Installshield 项目。

我添加了一个主要升级项目并更改了 Product version , Product codePackage code.

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

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

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

我记得几年前用版本号 1.11.2 做过这件事,一切都很好,这是我怀疑当前问题与版本号有关的主要原因。

I think it's related to the fact that my old version number was 1.0.4.23 and new one is 1.0.4.24 - is this a problem? Does major upgrade ignores such a small change in version?

是的,只有版本号的前三个字段对重大升级有意义。第四个字段被忽略了。

这在 Major Upgrades MSDN page 的注释中有说明。

如果您想触发重大升级,您的新版本号必须为 1.0.5.0 或更高。


编辑:

正如 Christopher Painter 指出的那样:

There is a way around this if you must use all four fields. You can create a custom action that does your own implementation of FindRelatedProducts and sets the action property with a ProductCode that RemoveExistingProducts then acts upon.

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

  1. 致电 MsiGetProperty 获取产品的 UpgradeCode
  2. 调用 MsiEnumRelatedProducts() 以枚举与您的产品具有相同 UpgradeCode 的所有产品。
  3. 调用 MsiQueryProductState() 验证 MsiEnumRelatedProducts() 返回的产品是否已实际安装。我遇到过 MsiEnumRelatedProducts() 返回不再安装的孤立产品的情况。因此,通过使用 MsiQueryProductState().
  4. 仔细检查安装状态,代码将更加健壮
  5. 调用MsiGetProductInfo(),将INSTALLPROPERTY_VERSIONSTRING作为szProperty参数的参数,查询已安装产品的版本。不要使用 INSTALLPROPERTY_VERSION,因为 INSTALLPROPERTY_VERSION 仅来自版本号的前三个字段,这是我们要避免的问题。
  6. 比较版本号时,确保你不只是比较字符串,而是 parse the strings into the fields that are separated by '.' and compare the fields individually.
  7. 如果您找到想要更换的匹配产品,请致电 MsiSetProperty() to set the ActionProperty to the ProductCode of this product that RemoveExistingProducts 然后采取行动。