0

安装了一个旧程序,该程序使用 InstallShield 为 VS2013 生成的包安装。最近升级到 VS2015 社区,但由于社区无法使用 InstallShield,我不得不使用 Installer Projects 重做我的安装程序。我已经到了我有一个工作安装程序的地步,一切似乎都很好,直到我尝试升级。我的安装程序中有一个匹配UpgradeCode,更大的Version数字,InstallAllUsers与旧的匹配,并RemovePreviousVersions设置为 true。Afaik 一切都应该井井有条。

正确运行新安装程序会卸载以前的版本,并且 GUI 看起来像是正确安装了新安装程序,它甚至正确显示在控制面板的添加/删除程序列表中。然而,应该安装新版本的整个目录都不见了。再次运行安装程序进行修复,然后真正安装新文件。

我错过了什么?为什么不能一次性通过升级?在这种情况下可以进行什么样的调试?

非常感谢任何有用的评论、指针和链接。

编辑:发布后,我也尝试过对我的程序集进行版本控制,正如此处指出的那样,但没有结果。我发现版本 65535 是无效的。

谷歌告诉我有一个叫做 的东西REINSTALLMODE,但我似乎找不到任何可以影响它的地方。

4

1 回答 1

0

首先,感谢@zett42 的有用评论。你给了我恰到好处的关键词,引导我朝着正确的方向前进,最终引导我找到解决方案。

我最终设置REINSTALLMODEamus更改了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 文件,即使我只在 msi 包上做事,因为 PostBuildEvent 运行时 exe 已经存在。如果有人对此有一个简单的解释,我将不胜感激。

于 2017-04-04T07:11:47.727 回答