Visual Studio 2010安装项目 - 对现有安装的轻微更新

时间:2011-07-21 16:51:25

标签: .net wpf visual-studio-2010 windows-installer setup-project

我在Visual Studio 2010中创建了一个WPF应用程序。我还创建了一个安装项目来安装此应用程序。安装项目处理先决条件,复制二进制文件,填充开始菜单和桌面,设置文件关联和图标等。这一切都很有效。

我现在正在开发一个更新程序,它应该将我的应用程序更新为更高版本的小版本(错误修复等)。我正在使用NetSparkle框架来处理更新过程。我已经让这个过程本身有效了,但是我在创建一个可以满足我想要的更新MSI文件时遇到了问题。

以下是我的尝试:

  1. 我创建了第二个安装项目,目的是构建“更新”MSI文件。它所做的就是复制新的二进制文件。它有一个单屏UI,显然不处理先决条件,快捷方式,图标,文件关联等。
  2. 我确保UpgradeCode与我的主安装程序安装项目的UpgradeCode相同
  3. 我已将Version设置为高于我的主安装程序安装项目
  4. 所以我构建了更新程序MSI,并将其插入NetSparkle更新过程。它似乎工作,但它是我的应用程序在控制面板程序和功能(具有更高的版本号)创建第二条目,它似乎也重置我的应用程序的配置设置 - 我需要那些保持完整!正如我所说,这只是一个小错误修复更新,而不是一个全新的替代品。

    我做错了什么?有人能指出我正确的方向吗?我甚至需要MSI来更新文件吗? (我应该使用补丁吗?如果是这样,我该如何创建补丁?)

    更新:我一直在玩RemovePreviousVersions。如果我将其设置为false,则结果如上所述。如果我将其设置为true,则程序和功能中的重复条目将消失,但它也会删除所有文件关联,图标,开始菜单和桌面链接等,这不是我想要的。它还打破了NetSparkle流程,因为该应用程序不会自动重新启动。实际上,我想要做的就是覆盖安装文件,就是这样,无论用户是在升级一个次要版本还是X次要版本。

2 个答案:

答案 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不支持修补程序,因此您需要手动创建它们。如果您想要一个更简单的解决方案,那么有商业设置创作工具可以直接支持更新程序和补丁。