我几天都面临一个问题,经过多次研究,我找不到任何适合我的情况。
事情是这样的:我正在使用 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 的行为以及如何解决它?
谢谢