我有一个 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
做过,一切都很好,这就是我怀疑当前问题与版本号有关的主要原因。
我认为这与我的旧版本号有关 1.0.4.23,新版本是 1.0.4.24 - 这是一个问题吗?大升级会忽略这么小的版本变化吗?
是的,只有版本号的前三个字段对于重大升级有意义。第四个字段被简单地忽略。
这在重大升级 MSDN 页面的注释中进行了说明。
如果您想触发重大升级,您的新版本号必须为
1.0.5.0
或更大。
编辑:
正如克里斯托弗·佩因特指出的:
如果您必须使用所有四个字段,则有一种解决方法。你可以 创建一个自定义操作来执行您自己的实现 FindRelatedProducts 并使用 ProductCode 设置操作属性 然后,RemoveExistingProducts 就会对其进行操作。
自定义操作可以这样实现:
MsiGetProperty
获取您产品的升级代码。MsiEnumRelatedProducts()
枚举与您的产品具有相同 UpgradeCode 的所有产品。MsiQueryProductState()
验证 MsiEnumRelatedProducts()
返回的产品是否已实际安装。我遇到过一些情况,MsiEnumRelatedProducts()
退回不再安装的孤立产品。因此,通过使用 MsiQueryProductState()
仔细检查安装状态,代码将会更加健壮。MsiGetProductInfo()
,并以INSTALLPROPERTY_VERSIONSTRING
作为szProperty
参数的参数,查询已安装产品的版本。不要使用 INSTALLPROPERTY_VERSION
来代替,因为 INSTALLPROPERTY_VERSION
仅源自版本号的前三个字段,这是我们要避免的问题。MsiSetProperty()
将 ActionProperty 设置为该产品的 ProductCode,然后 RemoveExistingProducts
进行操作。