VS2008安装项目:卸载以前的MSI

我有一个VS2008安装项目,它创建一个安装WinForms应用程序(C#)的setup.msi。

每次更新版本号时,用户首先必须卸载以前的版本才能安装新版本。 否则我们得到可怕的“此产品的另一个版本已安装”消息。

这是我在构建新版本安装程序时已经在做的事情:

  • 设置RemovePreviousVersions = true和DetectNewerInstalledVersion = true
  • 增加AssemblyVersion (正在部署的exe)
  • 增量版本 (安装项目)
  • 生成一个新的ProductCode (当VS更改时,由VS提示)
  • 保持UpgradeCode不变

然而它仍然拒绝卸载以前的版本。 那么,我错过了什么? 或者我做错了什么?

谢谢!

半回答我自己的问题,只是为了所有感兴趣的人的利益:

首先,我发现了一篇关于MSI更新如何工作的非常有用的文章 。

其次,我找到了InstEd ,一个相当不错的免费软件MSI编辑器,它向我展示了我的MSI文件没有明显的错误。 (是的,我可以使用Orca,如果我不介意下载整个Windows SDK来获取它。)

第三,令人讨厌的是,原来的问题似乎已经解决了,我再也无法重现了。 如果它回来了,如果我再次修复它,我会在这里添加评论!

无论如何,所有这些都带来了一个新的 – 可以说是更糟糕的 – 问题:MSI现在宣称要更新应用程序,但实际上没有安装任何东西! 解决方案如下:

  • AssemblyVersion无关紧要,但AssemblyFileVersion绝对可以 :如果要安装新文件,它必须递增。 (与VS2005相比,这是VS2008的变化。例如,请参阅有关Microsoft群组的此讨论 。)
  • 但是,AssemblyFileVersion无法自动增加AssemblyVersion的方式。 将其设置为1.9。*(或其他)只会导致错误。 这次Stack Overflow的解决方案是将AssemblyVersion设置为自动增量,然后打开AssemblyInfo.cs并完全删除AssemblyFileVersion属性。 这将强制文件版本等于程序集版本。

要让它安装在以前的版本上:

  1. 突出显示安装项目。
  2. 按F4键获取属性。 (右键单击是一个不同的属性框。)
  3. 更改版本。 对提示要求更改产品代码说“是”。

请记住,即使您重建解决方案,它也不会重建安装项目。 您需要将安装项目重建为单独的步骤。

其次,您不需要每次都增加AssemblyVersion。 将它设置为类似2.1。*,它会自动执行。

我不是100%熟悉VS 2008安装项目(我自己使用Advanced Installer-强烈推荐它BTW;他们甚至有一个免费版本!),但我之前遇到过这个并且没有很清楚地记录。

版本号有4个部分 – 你很清楚我很确定:Major.Minor.Build.Revision。 Windows安装程序不会检查REVISION。 如果您正在做的只是递增修订,它将无法正常工作。 您必须至少增加ProductVersion值的构建。

希望有所帮助!

安装程序服务正在根据升级表的内容做出决策,这就是我的目标。 该表是否包含升级代码的条目,当前安装的版本的产品版本是否在为升级指定的版本范围内,属性是否正常(例如,未设置msidbUpgradeAttributesOnlyDetect属性),依此类推。

MSDN在这里描述了这一切 – http://msdn.microsoft.com/en-us/library/aa372379%28VS.85%29.aspx

不要忘记增加assemblyFileVersion! 如果未指定程序集文件版本,则编译器假定它与assemblyVersion相同。 但是,如果指定了assemblyFileVersion,则必须递增它。

我来这里是为了解决同样的问题。 阅读链接令人难以置信的有用文章后,我想我的问题是,我已经安装了以前版本的“Just me”选项,新安装程序选择了InstallAllUsers属性(在Visual Studio项目属性中)。 因此,从控制面板卸载以前的安装后,更新现在可以正常工作。 也许这有助于某人。