Installshield 重大升级不会卸载旧版本
Installshield major upgrade doesn't uninstall old version
我有一个 Installshield 项目。
我添加了一个主要升级项目并更改了 Product version
, Product code
和 Package code
.
使用新安装程序安装后,旧版本仍然存在(在 Add / Remove
中)
我认为这与我的旧版本号是 1.0.4.23
而新版本号是 1.0.4.24
这一事实有关 - 这是个问题吗?大升级会忽略版本这么小的变化吗属性?
在主要升级common
选项卡中我选择了Any earlier version
我记得几年前用版本号 1.1
和 1.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.
自定义操作可以这样实现:
- 致电
MsiGetProperty
获取产品的 UpgradeCode。
- 调用
MsiEnumRelatedProducts()
以枚举与您的产品具有相同 UpgradeCode 的所有产品。
- 调用
MsiQueryProductState()
验证 MsiEnumRelatedProducts()
返回的产品是否已实际安装。我遇到过 MsiEnumRelatedProducts()
返回不再安装的孤立产品的情况。因此,通过使用 MsiQueryProductState()
. 仔细检查安装状态,代码将更加健壮
- 调用
MsiGetProductInfo()
,将INSTALLPROPERTY_VERSIONSTRING
作为szProperty
参数的参数,查询已安装产品的版本。不要使用 INSTALLPROPERTY_VERSION
,因为 INSTALLPROPERTY_VERSION
仅来自版本号的前三个字段,这是我们要避免的问题。
- 比较版本号时,确保你不只是比较字符串,而是 parse the strings into the fields that are separated by '.' and compare the fields individually.
- 如果您找到想要更换的匹配产品,请致电
MsiSetProperty()
to set the ActionProperty to the ProductCode of this product that RemoveExistingProducts
然后采取行动。
我有一个 Installshield 项目。
我添加了一个主要升级项目并更改了 Product version
, Product code
和 Package code
.
使用新安装程序安装后,旧版本仍然存在(在 Add / Remove
中)
我认为这与我的旧版本号是 1.0.4.23
而新版本号是 1.0.4.24
这一事实有关 - 这是个问题吗?大升级会忽略版本这么小的变化吗属性?
在主要升级common
选项卡中我选择了Any earlier version
我记得几年前用版本号 1.1
和 1.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.
自定义操作可以这样实现:
- 致电
MsiGetProperty
获取产品的 UpgradeCode。 - 调用
MsiEnumRelatedProducts()
以枚举与您的产品具有相同 UpgradeCode 的所有产品。 - 调用
MsiQueryProductState()
验证MsiEnumRelatedProducts()
返回的产品是否已实际安装。我遇到过MsiEnumRelatedProducts()
返回不再安装的孤立产品的情况。因此,通过使用MsiQueryProductState()
. 仔细检查安装状态,代码将更加健壮
- 调用
MsiGetProductInfo()
,将INSTALLPROPERTY_VERSIONSTRING
作为szProperty
参数的参数,查询已安装产品的版本。不要使用INSTALLPROPERTY_VERSION
,因为INSTALLPROPERTY_VERSION
仅来自版本号的前三个字段,这是我们要避免的问题。 - 比较版本号时,确保你不只是比较字符串,而是 parse the strings into the fields that are separated by '.' and compare the fields individually.
- 如果您找到想要更换的匹配产品,请致电
MsiSetProperty()
to set the ActionProperty to the ProductCode of this product thatRemoveExistingProducts
然后采取行动。