有一个旧程序,该程序与 InstallShield 为 VS2013 生成的软件包一起安装。最近升级到VS2015社区,但由于InstallShield不适用于社区,我不得不使用安装程序项目重做我的安装程序。 我已经到了我有一个工作安装程序的地步,一切似乎都很好,直到我尝试升级。我的安装程序中有一个匹配的UpgradeCode
,Version
数较大,InstallAllUsers
与旧匹配,并且RemovePreviousVersions
设置为 true。阿法克一切都应该井井有条。
正确运行新安装程序会卸载以前的版本,并且 GUI 看起来像正确安装新版本,它甚至正确显示在控制面板的添加/删除程序列表中。但是,缺少应该安装新版本的整个目录。 再次运行安装程序进行修复,然后真正安装新文件。
我错过了什么?为什么不能一口气完成升级?在这种情况下可以使用哪种调试?
任何有用的评论,指针和链接将不胜感激。
编辑:发布后,我也尝试对我的程序集进行版本控制,正如这里指出的那样,但没有结果。我发现版本 65535 无效。
谷歌告诉我有一种叫做REINSTALLMODE
的东西,但我似乎找不到任何可以影响它的地方。
首先,感谢@zett42的有益评论。你给了我恰到好处的关键词来引导我朝着正确的方向前进,最终引导我找到解决方案。
我最终将REINSTALLMODE
设置为amus
并更改了RemoveExistingProducts
序列值。老实说,我不知道为什么是 1525,但它现在可以工作,并且根据我之前的测试,一旦从 InstallShield 安装的软件包迁移完成,我就不需要做所有这些,升级就可以了。 无论如何,在这篇文章的帮助下,以下脚本是基于这个答案建模的,甚至微软的文档也很有用(一次)。
那么,这是我的add_reinstall_prop.vbs:
set objArgs = WScript.Arguments
set o_installer = CreateObject("WindowsInstaller.Installer")
set o_database = o_Installer.OpenDatabase(objArgs(0), 1)
set o_MSIView = o_DataBase.OpenView("INSERT INTO Property (Property, Value)
Values( 'REINSTALLMODE', 'amus')")
o_MSIView.Execute
set o_MSIView = o_DataBase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1525 WHERE Action='RemoveExistingProducts'")
o_MSIView.Execute
o_DataBase.Commit
使用 PostBuildEvent 自动应用它:
"%VS_PBE_TOOLS_PATH%add_reinstall_prop.vbs" "$(BuiltOuputPath)"
其中 %VS_PBE_TOOLS_PATH% 是指向目录的环境变量。
不知何故,此更改也会影响安装程序项目生成的 exe 文件,即使 afaik 我只在 msi 包上做事,因为 exe 在 PostBuildEvent 运行时已经存在。如果有人对此有一个简单的解释,我将不胜感激。