4

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

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

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

我的安装项目的设置是:
DetectNewerInstalledVersion : True
InstallAllUsers : True
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 的行为以及如何解决它?

谢谢

4

2 回答 2

3

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

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

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

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

于 2018-08-09T17:08:26.683 回答
0

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

  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

于 2018-08-13T21:25:13.670 回答