【问题标题】:RemovePreviousVersions=true, uninstalls previous but silently fails to install newRemovePreviousVersions=true,卸载以前的版本,但静默安装新版本失败
【发布时间】:2017-04-04 15:11:47
【问题描述】:

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

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

我错过了什么?为什么不能一口气升级?这种情况下有哪些调试方法?

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

编辑:发布后,我也尝试了versioning my assemblies,正如here 指出的那样,但没有结果。我发现版本 65535 是无效的。

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

【问题讨论】:

  • 启用详细日志记录以查看实际情况。 msiexec -i yoursetup.msi -l*v logfile.txt
  • @zett42 哇,3k 行调试,我看到了很多 guid 和神秘的属性更改说明等。在阅读时我应该寻找任何常见的字符串吗?
  • MSI (s) (78:E8) [09:47:04:318]:文件:C:\Program Files (x86)\...AddIn.dll;覆盖;不会打补丁;现有文件是较低版本。这看起来很重要
  • 是的,所以我似乎很清楚我的问题确实与版本有关,并且可能 InstallShield 已经写入了一些高得离谱的旧文件。发现我可以在创建 msi 后change REINSTALLMODE,所以现在真正的问题是,我该怎么做才能影响生成的 msi 和 exe 文件
  • msi 想先复制新文件,然后再删除旧版本 -- 这是可能的,取决于RemoveExistingProducts 操作的顺序。如果之后确实删除了旧版本,这可能已经是问题的根源,因为这很难解决。我建议在InstallInitialize 之前立即对RemoveExistingProducts 进行排序。 MSDN 指出这是“效率低下”,但根据我的经验,这是最稳健的方式。

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


【解决方案1】:

首先,感谢 @zett42 提供帮助的 cmets。你给了我恰到好处的关键词,引导我走向正确的方向,最终引导我找到解决方案。

我最终将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 文件,即使我只在 msi 包上执行操作,因为 PostBuildEvent 运行时 exe 已经存在。如果有人对此有简单的解释,我将不胜感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    相关资源
    最近更新 更多