VS2008设置项目:卸载先前的MSI

13

我有一个VS2008安装项目,它创建了一个setup.msi文件,用于安装一个WinForms应用程序(使用C#编写)。

每次更新版本号时,用户都必须先卸载旧版本,然后才能安装新版本。否则我们会收到可怕的“另一个版本的此产品已经安装”消息。

以下是我构建安装程序的新版本时所做的事情:

  • RemovePreviousVersions设置为true,DetectNewerInstalledVersion设置为true
  • 增加exe程序集版本号(部署时的那个)
  • 增加安装程序的Version
  • 生成一个新的ProductCode(当更改版本时由VS提示)
  • 保持UpgradeCode不变

但它仍然拒绝卸载之前的版本。那么我错过了什么呢?或者我做错了什么呢?

谢谢!


你是直接运行 Setup.exe 文件还是 YourApp.msi? - cmw
我知道它不能提供.msi的全部灵活性,但是ClickOnce部署是一个选择吗?它将自动更新而无需卸载,甚至可以允许用户回滚到先前的版本(如果你允许)。此外,您尝试过这些选项的不同排列组合吗?不增加AssemblyVersion呢? - Jay
运行setup.exe或msi都会产生相同的结果。 我可能还没有尝试过每种选项的组合,但现在我肯定已经尝试了大部分!我肯定尝试过保持AssemblyVersion不变 - 我非常确定AssemblyVersion在这里并不重要。 - Matt Bishop
哦,不过ClickOnce不是一个选项,唉... - Matt Bishop
6个回答

19

半自问自答,供有兴趣的人参考:

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

其次,我找到了InstEd,这是一个相当好用的免费MSI编辑器,它告诉我我的MSI文件没有明显的问题。(是的,如果我不介意下载整个Windows SDK的话,我也可以使用Orca。)

第三,令人恼火的是,原来的问题似乎已经自行解决了,我无法再次复现。如果问题再次出现,并且我再次修复它,我会在这里添加评论!

总之,所有这些都引出了一个新的、更糟糕的问题:MSI现在声称要更新应用程序,但实际上并没有安装任何东西!解决方案如下:

  • AssemblyVersion无关紧要,但是AssemblyFileVersion绝对不能忽略:如果你想安装新文件,它必须增加(这是VS2008相对于VS2005的变化。例如,请参见Microsoft论坛上的此 讨论)。
  • 但是,AssemblyFileVersion不能像AssemblyVersion一样自动增加。将它设置为1.9.*(或其他任何值)将导致错误。这次来自Stack Overflow的解决方案是将AssemblyVersion设置为自动增量,然后打开AssemblyInfo.cs文件并完全删除AssemblyFileVersion属性。这将强制文件版本等于程序集版本。

AssemblyVersion和AssemblyFileVersion对我帮助很大,特别是不需要将AssemblyFileVersion放在AssemblyInfo.cs文件中!非常有帮助! - psulek
同意最后一点。按照问题要求进行操作,并确保在AssemblyInfo.cs中移除AssemblyFileVersion。 - cmroanirgo
我有同样的问题,我发现这个解决方案“勉强可用”。不幸的是,因为我将应用程序数据存储在Application.LocalUserAppDataPath中,所以我无法更改文件版本,否则这将指向一个新的文件夹\AppData\Local\Company\AppName\V1.0.0.2等,而我的所有数据都在V1.0.0.0中。每当exe和安装程序更新时,这将要求我将所有数据重建到新文件夹中。有什么建议吗? - Richard Baxter

5
要安装在先前版本之上:
  1. 选择安装项目。
  2. 按下F4键以获取属性。(右键单击会出现不同的属性框。)
  3. 更改版本。对于询问是否更改产品代码的提示,请选择是。
请记住,即使您重新构建解决方案,它也不会重新构建安装项目。您需要将其作为单独的步骤重新构建安装项目。
其次,每次都不需要增加AssemblyVersion。将其设置为类似于2.1.*的内容,它会自动完成。

我不确定是不是只有我这样,但在VS2010中似乎每次都能正常工作。 - JBrooks

4
我不完全熟悉VS 2008安装程序(我自己使用Advanced Installer - 强烈推荐它,他们甚至有免费版本!),但我以前遇到过这个问题,而且文档不是很清楚。版本号有4个部分 - 我相信你很清楚:Major.Minor.Build.Revision. Windows Installer不检查REVISION。如果你只是增加修订版,它不起作用。你必须至少增加ProductVersion值的build。希望对你有所帮助!

我总是至少增加小版本号,所以我不认为那会是问题。不过还是谢谢你指出了Advanced Installer... - Matt Bishop

0

安装程序服务根据升级表的内容做出决策,因此您应该在那里查找。 升级代码是否有条目,当前安装版本的产品版本是否落在指定升级版本范围内,属性是否正确(例如,msidbUpgradeAttributesOnlyDetect属性未设置),等等。

MSDN在此处描述了所有内容 - http://msdn.microsoft.com/en-us/library/aa372379%28VS.85%29.aspx


0
不要忘记递增 assemblyFileVersion!如果您没有指定程序集文件版本,则编译器会假定其与程序集版本相同。但是,如果指定了 assemblyFileVersion,则必须递增它。

0

我来这里是为了解决同样的问题。在阅读了链接的非常有用的文章后,我认为我的问题在于,我以“只有我”选项安装了之前的版本,而新的安装程序选择了InstallAllUsers属性(在Visual Studio项目属性中)。所以,在控制面板中卸载了以前的安装程序后,更新现在可以正常工作。也许这可以帮助某些人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接