我有一个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
并且一切都运行良好,这是我怀疑当前问题与版本号相关的主要原因。
答案 0 :(得分:5)
我认为这与我的旧版本编号相关 1.0.4.23和新的是1.0.4.24 - 这是一个问题吗?主要升级是否忽略版本中的这么小的变化?
是的,只有版本号的前三个字段对于主要升级才有意义。第四个字段被忽略了。
这在Major Upgrades MSDN page的说明中说明。
如果您要触发重大升级,则新版本号必须为1.0.5.0
或更高。
修改:
Christopher Painter指出:
如果你必须使用所有四个字段,有一种解决方法。您可以 创建一个自己执行的自定义操作 FindRelatedProducts并使用ProductCode设置action属性 然后,RemoveExistingProducts会对其起作用。
自定义操作可以像这样实现:
MsiGetProperty
以获取您产品的 UpgradeCode 。MsiEnumRelatedProducts()
以枚举与您的产品具有相同 UpgradeCode 的所有产品。MsiQueryProductState()
以确认MsiEnumRelatedProducts()
返回的产品是否已实际安装。我遇到过MsiEnumRelatedProducts()
返回不再安装的孤立产品的情况。因此,通过使用MsiQueryProductState()
仔细检查安装状态,代码将更加健壮。INSTALLPROPERTY_VERSIONSTRING
作为szProperty
参数的参数调用MsiGetProductInfo()
,以查询已安装产品的版本。请勿使用INSTALLPROPERTY_VERSION
,因为INSTALLPROPERTY_VERSION
仅来自版本号的前三个字段,即我们要避免的问题。MsiSetProperty()
将ActionProperty设置为此产品的 ProductCode RemoveExistingProducts
然后执行时。