我正面临一个问题好几天,经过多次研究,我找不到任何适合我的情况。
这是事情: 我正在使用包含多个项目和安装项目的解决方案的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)时,它的工作原理就像所描述的那样好。 (我不确定它的编辑版本是哪个版本,但我想这是VS2008版本。)
现在,当我运行MSI时,它似乎首先运行“安装序列”,用新的替换旧的.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的行为以及如何解决它?
由于
答案 0 :(得分:0)
这似乎是该插件的错误 “ Microsoft Visual Studio 2017安装程序项目”。 使用错误的序列号(太高)构建了msi文件。在安装新文件后 会卸载旧产品,因此会错误地删除新文件。
手动修复:更改顺序,以便在安装新产品之前先卸载旧产品。
我最终创建了一个简单的脚本来作为构建后的步骤自动进行此修复。您可以在github上找到它... InstallerStuff
答案 1 :(得分:0)
该文章在两个方面刚刚过时:
这并不能说明在更高版本的Visual Studio安装项目中,升级已更改为在现有文件的“顶部”,然后删除了较旧的产品。这不是错误,而是功能。示例:如果您安装的产品带有一个数据库,然后该数据库由客户填充了一百万个数据库条目,则旧的升级会将其删除,然后再安装新版本的产品。
由于新版本是在旧版本上安装的,因此会应用文件替换更新规则,例如,新版本替换旧版本(基于文件版本)并且首次安装后修改的文件不会被删除(因此保留我们的假设数据库)。
https://docs.microsoft.com/en-us/windows/desktop/msi/default-file-versioning
话虽如此,但这似乎不是问题的原因。如果您是从VS 2008升级到VS 2010的,这听起来像是您遇到了这个问题: