【问题标题】:Why doesn't my new Windows Installer file (MSI) install properly over an older version of the MSI?为什么我的新 Windows Installer 文件 (MSI) 不能正确安装在旧版本的 MSI 上?
【发布时间】:2009-06-18 15:46:45
【问题描述】:

症状

我有新创建的安装程序包 (MSI),用于安装我的应用程序的新版本。

我有一个新的 ProductCode 用于我的安装,但我将 UpgradeCode 保持不变。

所以当我执行新的 MSI 时,它首先会正确卸载旧版本。甚至 Program Files\MyProduct 目录也被删除了。

但在卸载旧版本后,安装程序只会部分安装新版本。如果我修复损坏的新安装(使用添加删除程序->修改安装->修复),一切都修复了。

如果我首先使用“添加删除程序”卸载旧版本,然后安装新版本,一切正常。仅当我在旧版本之上安装新版本时才会出现此问题。

可能的原因

旧版本中各种dll和exe的版本号弄乱了。旧的 exe 版本是 4.11.1234。新 exe 的版本是 4.5.1234。根据“文件版本控制规则”,新文件不会覆盖旧文件。我摸不着头脑的原因是,当 InstallFiles 操作执行时,目标文件不再驻留在磁盘上。

其他信息

我的目标是 Windows Installer 3.1。

我的安装执行顺序大致是:

...
InstallValidate
RemoveExistingProducts
InstallInitialize
...
InstallFiles
...
InstallExecute
InstallFinalize
....

如果这个上下文没有把问题说清楚,请告诉我...

谢谢!

【问题讨论】:

    标签: windows-installer


    【解决方案1】:

    我假设您也更改了 PackageCodeProductVersion

    “我挠痒痒的原因 头是那个时候 InstallFiles 操作执行 目标文件不再驻留在 磁盘。”

    是的,但 MSI 会在文件被物理删除之前决定安装/不安装文件 - 该决定是在第一次通过 InstallExecute 序列时做出的,此时文件仍在硬盘驱动器上。

    我遇到了您遇到的问题,我可以通过将文件的版本更改为比硬盘上已有的版本更新来解决该问题 - 您可以这样做吗?

    另一种选择:您是否在使用 InstallShield?您可以选择在可以解决问题的单个文件上设置两个属性之一:1)始终覆盖,2)覆盖系统版本。 “始终覆盖”会自动将版本号设置为 65535.0.0.0,从而启用安装。 “覆盖系统版本”允许您输入自己的版本,高于实际文件版本,从而也启用安装。右键单击该文件并查看“属性”以设置这些选项。

    【讨论】:

    • 文件版本增加确实(部分)解决了问题。我实际上同时遇到了几个不同的问题。但是,当我将新组件的版本提升到 5.0.* 时,卸载旧组件(但具有较新版本号)就消失了。谢谢!
    猜你喜欢
    • 2012-04-18
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多