代码之家  ›  专栏  ›  技术社区  ›  Peter Stephens

为什么我的新Windows Installer文件(MSI)不能在旧版本的MSI上正确安装?

  •  3
  • Peter Stephens  · 技术社区  · 16 年前

    症状

    我新建了安装程序包(msi),安装了我的应用程序的新版本。

    我有一个新的产品代码用于安装,但我保留了相同的升级代码。

    所以当我执行新的MSI时,它首先正确地卸载旧版本。甚至程序文件\myproduct目录也会被删除。

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

    如果我先使用“添加/删除程序”卸载旧版本,然后安装新版本,一切都会很好地工作。只有当我在旧版本的基础上安装新版本时,问题才会出现。

    可能原因

    旧版本中各种dll和exes的版本号混乱。旧的exe版本是4.11.1234。新exe的版本为4.5.1234。根据“文件版本控制规则”,新文件不会覆盖旧文件。我抓耳挠腮的原因是,到installfiles操作执行目标文件时,目标文件已不在磁盘上。

    其他信息

    我的目标是Windows Installer 3.1。

    我的安装执行顺序大致如下:

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

    如果上下文不清楚,请告诉我…

    谢谢!

    1 回复  |  直到 16 年前
        1
  •  5
  •   William Leara    16 年前

    我假设你也改变了 PackageCode ProductVersion ?

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

    是的,但MSI决定在实际删除文件之前安装/不安装文件——该决定是在文件仍在硬盘上时,在第一次通过InstallExecute序列时做出的。

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

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