【问题标题】:visual studio setup project : update doesn't work视觉工作室设置项目:更新不起作用
【发布时间】:2012-06-28 10:24:12
【问题描述】:

我遇到一个问题好几天了,经过多次研究,我找不到任何适合我的情况。

事情是这样的: 我正在使用 Visual Studio 2010 开发一个包含多个项目和一个安装项目的解决方案。我希望安装项目创建一个 MSI 文件以将产品从 1.5 版更新到 1.6 版。

我按照本教程http://www.simple-talk.com/dotnet/visual-studio/updates-to-setup-projects/ 更新了解决方案的每个项目的程序集版本和文件版本号。

我的安装项目的设置是:
DetectNewerInstalledVersion :
InstallAllUsers :
RemovePreviousVersions : True
版本:1.6.3
ProductCode 与上一版本的 ProductCode 不同
并且 UpgradeCode 与上一版本的 UpgradeCode 相同。

我读到通常 MSI 应该删除版本比现有文件新的文件并替换为新文件。当我运行以前的 MSI(将产品从 1.4 更新到 1.5 的那些)时,它就像描述的那样工作得很好。 (我不确定它是用哪个版本的 Visual Studio 编译的,但我猜它是用 VS2008 编译的)。

现在当我运行我的 MSI 时,它似乎首先运行将旧 .exe 替换为新 .exe 的“安装序列”,然后运行删除 .exe 的“卸载序列”。当安装“完成”时,我的应用程序目录中不再有 .exe。 (但在“添加/删除程序”面板中,产品显示为安装在 1.6 版中)。

(注意:我可以注意到 MSI 的“安装”部分或“卸载”部分何时运行,因为它们都具有打开控制台应用程序的自定义操作,我可以在其中进行跟踪)。

经过更多研究,我将旧 MSI 与我的 ORCA 进行了比较,我注意到 InstallExecuteSequence 表中的差异:
对于旧的 MSI,RemoveExistingProducts 的序列号是 1525,介于 InstallInitialize (1500) 和 AllocateRegistrySpace (1550) 之间。
在我的 MSI 中,RemoveExistingProducts 的序列号是 6550,介于 InstallExecute (6500) 和 InstallFinalize (6600) 之间。
我在表格中看不到任何其他差异。

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

如果有人知道我的 MSI 的行为以及如何解决它?

谢谢

【问题讨论】:

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

标签: visual-studio-2010 windows-installer setup-project visual-studio-setup-proje


【解决方案1】:

这似乎是插件的一个错误 “Microsoft Visual Studio 2017 安装程序项目”。 使用不正确的序列号(太高)构建 msi 文件。旧产品的卸载发生在安装新文件之后,因此新文件会被错误地删除。

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

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

我最终创建了一个简单的脚本来自动执行此修复作为后期构建步骤。你可以在这里得到它的github... InstallerStuff

【讨论】:

  • 只是作为补充。同样的问题在 VS2019 中仍然存在,但在设置属性中,您现在可以启用向后兼容 ID。不再需要手动编辑。
  • @msoft 你是对的,谢谢!向后兼容 ID 选项的描述完全具有误导性。
【解决方案2】:

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

  1. 它没有说明 Visual Studio 安装项目的更高版本中的升级已更改为在现有文件的“顶部”,之后旧产品被删除。这不是一个错误,这是一个功能。示例:如果您安装的产品包含一个数据库,然后客户使用一百万个数据库条目填充该数据库,则旧升级在安装新版本产品之前将其删除。

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

https://docs.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多