RemovePreviousVersions=true,卸载以前的版本但安装新版本失败
RemovePreviousVersions=true, uninstalls previous but silently fails to install new
得到一个旧程序,该程序是使用 InstallShield for VS2013 生成的包安装的。最近升级到 VS2015 社区,但由于 InstallShield 不适用于社区,我不得不使用安装程序项目重做我的安装程序。
我已经到了我有一个工作安装程序的地步,一切似乎都很好,直到我尝试升级。我的安装程序中有一个匹配的 UpgradeCode
,更大的 Version
数字,InstallAllUsers
匹配旧的 RemovePreviousVersions
设置为 true。 Afaik 一切都应该井井有条。
运行 新安装程序正确卸载了以前的版本,并且 GUI 看起来像是正确安装了新版本,它甚至正确地出现在控制面板的 add/remove 程序列表中。然而,应该安装新版本的整个目录都丢失了。
运行 安装程序再次修复然后真正安装新文件。
我错过了什么?为什么不能一次性升级?这种情况有什么调试方法?
非常感谢任何有用的评论、指示和链接。
编辑:发布后我也尝试了 versioning my assemblies as was pointed out here,但没有结果。不过我发现版本 65535 无效。
Google 告诉我有一个叫做 REINSTALLMODE
的东西,但我似乎找不到任何可以影响它的地方。
首先感谢@zett42 的宝贵意见。您给了我适量的关键字,引导我朝着正确的方向前进,最终引导我找到解决方案。
我最终将 REINSTALLMODE
设置为 amus
并更改了 RemoveExistingProducts
序列值。老实说,我不知道为什么 1525,但它现在可以工作,并且根据我之前的测试,一旦从安装了 InstallShield 的软件包迁移完成,我就不需要做所有这些,升级就可以了。
无论如何,以下脚本是基于 this answer, with help from this post, and even microsoft´s documentation 建模的,很有用(一次)。
那么,这是我的 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 已经存在。如果有人对此有一个简单的解释,我将不胜感激。
得到一个旧程序,该程序是使用 InstallShield for VS2013 生成的包安装的。最近升级到 VS2015 社区,但由于 InstallShield 不适用于社区,我不得不使用安装程序项目重做我的安装程序。
我已经到了我有一个工作安装程序的地步,一切似乎都很好,直到我尝试升级。我的安装程序中有一个匹配的 UpgradeCode
,更大的 Version
数字,InstallAllUsers
匹配旧的 RemovePreviousVersions
设置为 true。 Afaik 一切都应该井井有条。
运行 新安装程序正确卸载了以前的版本,并且 GUI 看起来像是正确安装了新版本,它甚至正确地出现在控制面板的 add/remove 程序列表中。然而,应该安装新版本的整个目录都丢失了。 运行 安装程序再次修复然后真正安装新文件。
我错过了什么?为什么不能一次性升级?这种情况有什么调试方法?
非常感谢任何有用的评论、指示和链接。
编辑:发布后我也尝试了 versioning my assemblies as was pointed out here,但没有结果。不过我发现版本 65535 无效。
Google 告诉我有一个叫做 REINSTALLMODE
的东西,但我似乎找不到任何可以影响它的地方。
首先感谢@zett42 的宝贵意见。您给了我适量的关键字,引导我朝着正确的方向前进,最终引导我找到解决方案。
我最终将 REINSTALLMODE
设置为 amus
并更改了 RemoveExistingProducts
序列值。老实说,我不知道为什么 1525,但它现在可以工作,并且根据我之前的测试,一旦从安装了 InstallShield 的软件包迁移完成,我就不需要做所有这些,升级就可以了。
无论如何,以下脚本是基于 this answer, with help from this post, and even microsoft´s documentation 建模的,很有用(一次)。
那么,这是我的 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 已经存在。如果有人对此有一个简单的解释,我将不胜感激。