6

我有一个使用 VS2005 用 C# 编写的 Windows 服务。

安装是通过一个向导调用 msiexec 来安装同样使用 VS2005 创建的 msi 文件。

我无法生成将从一个版本的服务升级到另一个版本的 msi 文件。向导程序处理当前安装版本的检测、停止服务、为 msiexec 提供适当的命令行,然后重新启动服务。

现有 msi 的版本属性为 1.1.02,新的为 1.1.03。产品代码和升级代码相同。

通过添加/删除程序手动卸载 1.1.02 可以正常工作,就像将 1.1.03 安装到“干净”系统上一样。

将 1.1.02 升级到 1.1.03 经历了一些动作,但最终结果是安装了 1.1.02。

向导用于升级的命令行是:

msiexec /qb /i "MyProduct.msi" REINSTALL="ALL" REINSTALLMODE="vos"

我哪里错了?我假设我一定错过了一些相当基本的东西......

备用位置是通知客户他们需要在运行向导安装 1.1.03 之前手动卸载 1.1.02,但我宁愿不必这样做。

编辑添加:

更改产品代码(正如 VS2005 也会提示您)实际上完全消除了升级的能力,因为如果以前没有安装过该产品代码,安装程序将不允许您重新安装。

然后它会让你做的就是安装(然后你会得到通常的“服务已经存在”类型的消息)。

4

3 回答 3

8

如果您想自动删除以前的版本,需要做几件事来获得“升级”以与 MSI 一起使用。

首先是一些关于神秘“代码”的背景信息。有 3 个代码 (GUID) 与 MSI 相关联:

  1. 包代码- 这标识了 MSI 安装程序的特定版本,并且不应该在构建之间重复使用。它必须始终更新。
  2. 产品代码- 此标识符用于标识应用程序的特定版本。何时分配新产品代码由安装程序作者决定。
  3. 升级代码- 这标识了应用程序,不应在其生命周期内更改

升级代码永远不会改变。升级scenerio,必须更改每个版本的产品代码。此外,正如您所提到的,您必须提高版本号。产品代码升级代码可以通过选择您的安装项目并转到属性窗口来找到。包代码隐藏在 Studio 中,并且将始终更新。

您可能缺少的项目是您还需要将属性窗口中的 RemovePreviousVersions 设置设置为true

于 2009-02-04T20:33:28.157 回答
7

除了 mohlsen 的回答(对于 Visual Studio 2008)之外,还有一件事:

为了让您的主输出(您的 EXE!)正确升级,您必须增加 FILE VERSION

此设置可在项目属性中找到:应用程序选项卡 -> 装配信息

于 2009-10-02T15:45:04.133 回答
2

一种更简单的管理方法是从所有程序集中删除 AssemblyFileVersion,包括主可执行文件和所有托管 DLL。

在您的每个 AssemblyInfo.cs 文件中,如果您不关心版本号,但希望有一些可追溯性,我建议您执行类似的操作。

[assembly: AssemblyVersion("1.1.*")]
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")]

一切仍然可以正常编译,如果您没有定义 AssemblyFileVersion,那么安装程序会假定每次都不同(如果您将所有 DLL 安装在主 EXE 旁边,这可能很好)。

我花了很长时间才弄清楚这一点,特别是如果我不想手动增加任何东西!

于 2011-05-25T20:51:56.150 回答