6

我正在寻找一种方法来防止我的应用程序降级。但“问题”是,我必须检查修订号

例如:安装 1.0.0.1 时应该可以安装 1.0.0.2 - 但安装 1.0.0.2 时应该无法安装 1.0.0.1。

我知道,Element MajorUpgrade 只检查前三个标记。也许有人可以给我一个想法,如何做到这一点?我可以写一个 CustomAction 来做到这一点吗?- 如果是,我如何在 CustomAction 中检查应该安装哪个版本以及安装哪个版本?我必须在哪里调用 CustomAction,如何显示消息并阻止从 CustomAction 安装?

4

2 回答 2

2

这是一个常见的要求。以下模式经常使用:

<Upgrade Id="THE-PRODUCT-GUID">
  <UpgradeVersion Property="PREVIOUSVERSIONINSTALLED" Minimum="1.0.0.0" Maximum="$(var.packageVersion)"
          IncludeMinimum="yes" IncludeMaximum="no" MigrateFeatures="yes" />
          IncludeMinimum="yes" IncludeMaximum="yes" />
  <UpgradeVersion Property="NEWERVERSIONINSTALLED" Minimum="$(var.packageVersion)" Maximum="99.0.0.0"
          IncludeMinimum="no" IncludeMaximum="yes" />
</Upgrade>

<InstallExecuteSequence>
  <Custom Action="PreventDowngrading" After="FindRelatedProducts">NEWERVERSIONINSTALLED&lt;&gt;"" AND NOT Installed</Custom>
  <RemoveExistingProducts After="InstallInitialize">PREVIOUSVERSIONINSTALLED&lt;&gt;""</RemoveExistingProducts>
</InstallExecuteSequence>

PreventDowngrading自定义操作本质上是一个破坏性错误:

<CustomAction Id="PreventDowngrading" Error="Newer version already installed." />
于 2012-05-06T11:58:48.230 回答
2

WIX 网站上的本教程对我有用。

总结一下,您必须在升级标签中添加 UpgradeVersion 标签,该标签应该在您的产品中。然后添加一个自定义操作并有条件地安排它 - 在 FindRelatedProducts 之前并测试是否已经安装了新版本。

代码可能类似于:

<Product ...>
 <Upgrade Id="YOUR-UPGRADE_GUID">  
  <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="{CURRENTVERSION}}" IncludeMinimum="no" />
 </Upgrade>
 <CustomAction Id="NoDowngrade" Error="Error Message" />
 <InstallExecuteSequence>
  <Custom Action="NoDowngrade" After="FindRelatedProducts">NEWERFOUND</Custom>
  <RemoveExistingProducts Before="InstallInitialize" />
 </InstallExecuteSequence>
</Product>

将 CURRENTVERSION 替换为您的产品的版本号。

于 2012-05-10T15:37:17.767 回答