我在Visual Studio 2010中创建了一个WPF应用程序。我还创建了一个安装项目来安装此应用程序。安装项目处理先决条件,复制二进制文件,填充开始菜单和桌面,设置文件关联和图标等。这一切都很有效。
我现在正在开发一个更新程序,它应该将我的应用程序更新为更高版本的小版本(错误修复等)。我正在使用NetSparkle框架来处理更新过程。我已经让这个过程本身有效了,但是我在创建一个可以满足我想要的更新MSI文件时遇到了问题。
以下是我的尝试:
UpgradeCode
与我的主安装程序安装项目的UpgradeCode相同Version
设置为高于我的主安装程序安装项目所以我构建了更新程序MSI,并将其插入NetSparkle更新过程。它似乎工作,但它是我的应用程序在控制面板程序和功能(具有更高的版本号)创建第二条目,它似乎也重置我的应用程序的配置设置 - 我需要那些保持完整!正如我所说,这只是一个小错误修复更新,而不是一个全新的替代品。
我做错了什么?有人能指出我正确的方向吗?我甚至需要MSI来更新文件吗? (我应该使用补丁吗?如果是这样,我该如何创建补丁?)
更新:我一直在玩RemovePreviousVersions
。如果我将其设置为false
,则结果如上所述。如果我将其设置为true
,则程序和功能中的重复条目将消失,但它也会删除所有文件关联,图标,开始菜单和桌面链接等,这不是我想要的。它还打破了NetSparkle流程,因为该应用程序不会自动重新启动。实际上,我想要做的就是覆盖安装文件,就是这样,无论用户是在升级一个次要版本还是X次要版本。
答案 0 :(得分:3)
我建议您查看WIX之类的内容来执行此操作。 VS Setup项目适用于简单的东西,但处理MSI安装的细微差别很棘手。使用WIX,您可以对MSI进行细粒度控制。
要开始使用,您可以使用其中一种工具导入现有的MSI,也可以从其中一个模板开始使用。我最初是从VS设置导入,然后将部分复制到其中一个WIX模板中。
他们的网站在upgrade process in their documentation上有一些很好的信息。
这是一篇讲述the pros and cons of a minor upgrade的帖子。另一个wix tutorial related to wix。
就我而言,我也想支持小型升级。我在我的WIX文件中使用以下内容来控制升级检测逻辑:
<!--
This upgrade table will control how and when the installer detect a major upgrade.
-->
<Upgrade Id="$(var.UpgradeCode)">
<UpgradeVersion Minimum="$(var.ProductVersion)" Property="NEWPRODUCTFOUND" OnlyDetect="yes" IncludeMinimum="no" />
<UpgradeVersion Minimum="1.0.0" Maximum="$(var.ProductVersion)" Property="UPGRADEFOUND" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
答案 1 :(得分:1)
将RemovePreviousVersions设置为true时,您使用的是major upgrade。因此旧版本会自动卸载旧版本。如果要使用主要升级,则新版本应该是完整的独立安装程序(包括先决条件,快捷方式,图标,文件关联等)。
您所描述的是patching。 Visual Studio不支持修补程序,因此您需要手动创建它们。如果您想要一个更简单的解决方案,那么有商业设置创作工具可以直接支持更新程序和补丁。