Visual Studio 安装项目:更新无效

7
我遇到了一个问题,已经研究了几天,但是没有找到符合我的情况的解决方案。这就是情况:我正在使用 Visual Studio 2010 处理包含多个项目和安装项目的解决方案。我想让安装项目创建一个 MSI 文件,将产品从版本 1.5 升级到版本 1.6。我按照这个教程 http://www.simple-talk.com/dotnet/visual-studio/updates-to-setup-projects/ 进行操作,并更新了解决方案中每个项目的程序集版本和文件版本号。我的安装项目设置如下:
检测到新安装的版本:True
安装所有用户:True
删除以前的版本:True
版本:1.6.3
ProductCode 不同于以前版本的 ProductCode
UpgradeCode 与以前版本的 UpgradeCode 相同。
我了解到通常情况下,MSI应该删除版本比现有文件更新的文件,并用新文件替换。当我运行之前的MSI(将产品从1.4更新到1.5的那些)时,它按照描述正常工作。(我不确定它是使用哪个版本的Visual Studio编译的,但我猜测是VS2008。)
现在当我运行我的MSI时,它似乎首先运行“安装序列”,用新的.exe替换旧的,然后运行“卸载序列”,擦除.exe。当安装“完成”时,我的应用程序目录中没有.exe。(但是在“添加/删除程序”面板中,产品以1.6版本安装。)
(注:我可以注意到MSI的“安装”部分或“卸载”部分正在运行,因为两者都有打开控制台应用程序的自定义操作,我可以跟踪。)
经过更多的研究,我用 ORCA 比较了旧的 MSI 和我的 MSI,在 InstallExecuteSequence 表中发现了不同之处:
在旧的 MSI 中,RemoveExistingProducts 的序列号是 1525,位于 InstallInitialize(1500)和 AllocateRegistrySpace(1550)之间。
在我的 MSI 中,RemoveExistingProducts 的序列号是 6550,位于 InstallExecute(6500)和 InstallFinalize(6600)之间。
我没有看到表中其他的差异。

我甚至尝试使用 ORCA 手动编辑 MSI,并将 RemoveExistingProduct 的序列号设置为 1525。执行时,“卸载部分”运行正常,但随后出现了 2356 错误(经过一些研究,我猜测这是因为手动编辑 MSI 导致其损坏)。

如果有人有一个解释我的 MSI 行为及如何修复它的想法吗?

谢谢


更多精确信息:我尝试将RemovePreviousVersion设置为False,然后更新成功了,最终我的产品也被正确地更新了。但是在“添加/删除程序”面板中,该产品的两个版本出现了,一个是1.5版本,另一个是1.6版本。试图卸载1.5版本会产生与使用RemovePreviousVersions=TRUE编译的MSI相同的效果,即1.6版本的产品显示为已安装,但应用程序目录中没有.exe文件了。 - quinn
2
谢谢。你的问题帮助我解决了自动卸载之前版本的问题。 - Raj
也许这是一篇旧帖子,但供其他人参考,我遇到了类似的问题,并注意到更改项目文件的程序集版本号可以解决此问题。因此,在构建新的安装项目之前,所有其他已更改的项目的版本号也需要更新。 - rageit
2个回答

6

看起来这是与插件“Microsoft Visual Studio 2017 Installer Projects”有关的bug。MSI文件以一个错误的序列号(太高)构建。卸载旧产品发生在新文件的安装之后,因此新文件会被错误地删除。

手动修复:更改顺序,使旧产品的卸载在新项目的安装之前进行。

  • 使用orca.exe(或任何适合您的编辑器)打开msi
  • 转到InstallExecuteSequence表
  • 更改RemoveExistingProducts序列号,使其位于InstallValidate和InstallInitialize之间。例如,我将其从6550更改为1450。

最终我创建了一个简单的脚本,在构建后自动执行此修复。您可以在这里找到它的GitHub链接:InstallerStuff


2
只是补充一下,同样的问题仍然存在于VS2019中,但是在设置属性中,现在可以启用向后兼容的ID。不再需要手动编辑。 - msoft
@msoft 你是对的,谢谢!“向后兼容ID”选项的描述完全误导了。 - Catalin Iancu
感谢这个脚本,无论它是如何拼凑而成的,它都完成了工作。我想知道这个脚本是如何通过微软的QA测试的?我猜他们只是看到在添加/删除程序中有一个更新的条目就够了吧?说实话,我也是这么认为的,直到我遇到了一些奇怪的问题... - tobriand

2

这篇文章在两个方面已经过时:

  1. 它没有解释Visual Studio安装项目的后续版本中升级被更改为“置于顶部”,之后旧产品将被删除。这不是一个错误,而是一个特性。例如:如果您安装了一个带有数据库的产品,然后由客户填充了一百万个数据库条目,那么旧版本的升级会在安装新版本的产品之前将其删除。

  2. 因为新版本安装在旧版本上,所以会应用文件替换更新规则,例如,新版本替换旧版本(基于文件版本),首次安装后修改的文件不会被删除(因此保留了我们假设的数据库)。

https://learn.microsoft.com/en-us/windows/desktop/msi/default-file-versioning

话虽如此,这似乎不是问题的根本原因。如果你从VS 2008升级到VS 2010,那么你可能会遇到这个问题:

https://support.microsoft.com/en-us/help/2418919/fix-files-and-registry-keys-for-the-installation-path-disappear-unexpe


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