我如何说服VS2005 msi进行升级?

时间:2009-02-04 15:19:19

标签: c# visual-studio-2005 installation windows-installer upgrade

我使用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也会提示您)实际上完全取消了升级功能,因为如果以前没有安装该产品代码,安装程序将不允许您重新安装。

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

3 个答案:

答案 0 :(得分:8)

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

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

  1. 程序包代码 - 这标识了MSI安装程序的特定版本,不应在整个版本中重复使用。必须始终更新。
  2. 产品代码 - 此标识符用于标识特定版本的应用程序。由安装人员作者决定何时分配新的产品代码。
  3. 升级代码 - 这标识了应用程序,不应该在其生命周期内发生变化
  4. 升级代码永远不会改变。为了升级scenerio,必须为每个版本更改产品代码。此外,如您所述,您必须使用版本号。通过选择安装项目并转到“属性”窗口,可以找到产品代码升级代码包代码隐藏在Studio中,并且将始终更新。

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

答案 1 :(得分:6)

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

为了使您的主要输出(您的EXE!)正确升级,您必须增加文件版本

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

答案 2 :(得分:2)

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

在你的每个AssemblyInfo.cs文件中,如果你不关心版本号,我建议做这样的事情,但是想要有一些可追溯性。

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

一切仍然可以正常编译,如果你没有定义AssemblyFileVersion,那么安装程序会假定每次都有所不同(如果你要安装主EXE旁边的所有DLL,这可能就好了。) / p>

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