RemovePreviousVersions = true,卸载以前但无提示无法安装新的

时间:2017-03-31 15:10:11

标签: visual-studio-2015 windows-installer upgrade major-upgrade

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

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

我缺少什么?为什么它不能一次性完成升级?在这种情况下可以进行哪种调试?

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

编辑:发布后我也按照versioning my assemblies指出here,但没有结果。我发现版本65535无效。

谷歌告诉我有一些名为struct cpu的东西,但我似乎无法找到任何可以影响它的地方。

1 个答案:

答案 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已经存在。如果有人对此有一个简单的解释,我会很感激。