【问题标题】:WiX: MSI causing double entry in Programs and Features after major upgrade, also not uninstallingWiX:MSI 在重大升级后导致程序和功能重复输入,也没有卸载
【发布时间】:2018-02-20 04:59:01
【问题描述】:

我有一个包含很多 MSI 的项目(安装了引导程序)。最近,在一次重大升级后,我注意到程序和功能(Win 7)中没有卸载以前的版本。也就是说,从版本 1 升级到版本 2 后,版本 1 版本 2 都在 Programs and Features 中。

这是一个常见问题,但它是一个有很多不同灰度的问题——我有一个不常见的这个问题。

问题可能在于特定的 MSI。 此 MSI 只能在初始安装期间运行。因此我从不更改其版本号。这是它的样子(表明这是一次合法的重大升级):

    <Product Id="*"
         Name="MSI"
         Language="1033"
         Version="1.0.0.0"
         Manufacturer="Bob"
         UpgradeCode="GUID-HERE">
    <Package InstallerVersion="200"
             Compressed="yes"
             InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>
    <FeatureRef Id="ReferenceToFeature"/>
</Product>

这就是我认为这是导致问题的 MSI 的原因:当我运行主要升级时,程序和功能中有版本 1 和版本 2。当我使用详细日志运行卸载程序时,我可以看到它卸载了所有 MSI,因为我得到了 boostrapper 卸载日志文件,然后我得到了其余 MSI 的单独卸载日志文件。

如果我查看此 MSI 的日志文件,我发现了一个问题。这是我认为可能是问题的日志文件部分:

                             ...
PROPERTY CHANGE:  Adding INSTALLLEVEL property.  It's value is '1'.
Disallowing uninstallation of component: {GUID-HERE} since another client exists
Disallowing uninstallation of component: {GUID-HERE} since another client exists
                             ...

我认得这些 GUID。它们是我的 MSI 中组件的 GUID。我知道这意味着另一个程序正在使用该资源——这就是它不会卸载的原因——但在我的一生中,我想不出那会是什么程序!我在一个干净的虚拟机上安装,我的安装程序安装的程序在我卸载时没有运行!

更多信息让我认为此 MSI 导致 程序和功能 加倍:卸载第 2 版后,我当然只剩下第 1 版。当我卸载带有详细日志记录的版本 1,弹出的唯一 MSI 日志是有问题的 MSI!在卸载过程中不会卸载其他 MSI。

我已尝试将属性 AllowSameVersionUpgrade="yes" 添加到 MSI 的 元素 - - 这个

<MajorUpgrade AllowSameVersionUpgrade="yes" 
              DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

——这实际上破坏了我的安装程序,因为它会在更新安装期间安装 MSI,而我只希望在初始安装期间安装 MSI。它也不能解决问题,因为这两个版本仍然显示在程序和功能中。

但是,它确实会导致第一次卸载 MSI。也就是说,之前,当我没有输入 AllowSameVersionUpgrade="yes" 属性时,MSI 在版本 2 卸载期间不会成功卸载,然后当我卸载版本 1 我会得到一个日志文件来卸载它。当我添加属性时,我仍然会在 程序和功能 中获得双倍版本,除了这次我可以在第一次卸载期间卸载 MSI,然后在第二次卸载期间(应该的版本'一开始就不在那里),我没有得到任何 MSI日志文件——我得到的只是引导程序日志文件。

谁能解释这个问题?


好的!我设法在一个玩具程序中重现了这个问题,所以希望解决这个问题应该简单得多

先生。阿斯穆尔,感谢您的关注。不过,我解决了这个问题。我犯了一个非常非常愚蠢的错误,我不好意思承认。可以肯定地说,我这两天一直在追自己的尾巴,让我的雇主花钱,因为……嗯,我小时候就被摔在头上,结果我不太聪明。

【问题讨论】:

  • 我会敦促您分享您的修复作为您问题的答案(无论您认为错误是多么愚蠢,这并不意味着其他人也不会这样做),或者考虑删除这个问题。在研究一个问题时,没有什么比遇到“我解决了[但不会告诉你如何]!”的痕迹更令人沮丧的了。

标签: wix uninstallation windows-installer


【解决方案1】:

您的问题确实很常见,至少从表面上看是这样,但我不太了解整个问题场景。当您在添加/删除程序中有两个版本的相同 MSI 时,您的主要升级失败。然后,当您卸载其中一个版本时,您将获得您指示的日志文件条目:

Disallowing uninstallation of component: {GUID-HERE} since another client exists

基本上每个 MSI 组件安装两次,引用计数为 2,因为安装了相同 MSI 的两个版本。卸载两个 MSI 安装版本应该会正确删除有问题的组件(因为组件的引用计数会下降到 0)。

“此 MSI 只能在初始安装期间运行” - 这究竟是什么意思?我又读了一遍,恐怕我还不清楚。

这些其他 MSI 文件,套件 - 它们是什么,它们安装什么,它们安装到相同还是不同的位置?如果它们总是一起安装,为什么它们是单独的 MSI 文件?

请更新您的问题,而不是添加太多 cmets。

【讨论】:

    【解决方案2】:

    虽然与问题不完全相同,但我将添加同一问题的变体。我正在使用我自己的自定义引导程序应用程序(BA)并遇到同样的问题。这是因为我没有添加对 BA 的支持来处理命令行参数并静默运行。具体来说,升级将运行旧 BA,通过命令行告诉它静默运行并执行卸载(我没有处理)。

    顺便说一句,如果您要实现自己的 BA,我强烈建议您下载 WIX 源代码,因为它还实现了自定义 BA。

    PS:此线程提供了一系列选项以使升级正常工作。请注意,某些选项(例如使用 Upgrade/UpgradeVersion)早于其他选项(例如 MajorUpgrade 元素)。

    How to implement WiX installer upgrade?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2018-06-28
      • 2011-03-30
      • 2015-08-09
      相关资源
      最近更新 更多