安装了一个旧程序,该程序安装了InstallShield for VS2013生成的软件包。最近升级到VS2015社区,但由于社区无法使用InstallShield,我不得不使用Installer Projects重做我的安装程序。
我已经到了我有一个正常工作的安装程序,一切似乎都很好,直到我尝试升级。我的安装程序中有匹配的UpgradeCode
,较大的Version
个数字,InstallAllUsers
与旧的RemovePreviousVersions
匹配,REINSTALLMODE
设置为true。 Afaik一切都应该井然有序。
正确运行新安装程序会卸载以前的版本,并且GUI看起来正确安装新版本,它甚至可以在控制面板的添加/删除程序列表中正确显示。但是,缺少应安装新版本的整个目录。 再次运行安装程序进行修复然后真正安装新文件。
我缺少什么?为什么它不能一次性完成升级?在这种情况下可以进行哪种调试?
非常感谢任何有用的评论,指示和链接。
编辑:发布后我也按照versioning my assemblies指出here,但没有结果。我发现版本65535无效。
谷歌告诉我有一些名为struct cpu
的东西,但我似乎无法找到任何可以影响它的地方。
答案 0 :(得分:0)
首先,感谢@ zett42的有用评论。你给了我恰当数量的关键词来指导我正确的方向,最终让我找到了解决方案。
我最终将REINSTALLMODE
设置为amus
以及更改RemoveExistingProducts
序列值。老实说,我不知道为什么1525,但它现在有效,并且基于我之前的测试,一旦从安装了InstallShield的软件包迁移完毕,我不需要做所有这些,升级就行了。
无论如何,以下脚本是基于this answer建模的,在this post的帮助下,甚至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文件,即使afaik我只在msi包上做事情,因为当PostBuildEvent运行时exe已经存在。如果有人对此有一个简单的解释,我会很感激。