WiX:MSI在重大升级后导致程序和功能重复输入,也没有卸载

时间:2017-09-11 21:06:16

标签: wix windows-installer uninstall msiexec

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

这是一个常见的问题,但这是一个有很多不同灰色阴影的问题 - 我对这个问题的看法很少见。

问题可能在于特定的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 =&#34; yes&#34; 添加到 元素到MSI - 这个

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

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

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

有人可以解释这个问题吗?

OK!我设法在玩具程序中重新创建问题,所以,希望解决这个问题应该很多更简单!

先生。阿斯穆尔,我感谢你的兴趣。但是,我解决了这个问题。我犯了一个非常非常愚蠢的错误,我很尴尬地承认。可以说我已经追了两天自己的尾巴而且花了我的雇主钱,因为......好吧,我小时候就掉到了我的头上,因此我没有太明亮。

2 个答案:

答案 0 :(得分:2)

你的问题确实很常见,至少从表面来看,但我不太了解整个问题的情况。如果在添加/删除程序中有两个版本的相同MSI,则主要升级失败。当您卸载其中一个版本时,您将获得指示的日志文件:

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

基本上每个MSI组件安装两次,引用次数为2,因为安装了相同MSI的两个版本。卸载两个MSI安装程序版本应正确删除有问题的组件(因为组件的ref-count将降为0)。

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

这些其他MSI文件,套件 - 它们是什么,它们安装了什么,它们安装在相同或不同的位置?如果它们总是一起安装,为什么它们将MSI文件分开?

请更改您的问题,而不是添加太多评论。

答案 1 :(得分:0)

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

此外,如果要实现自己的BA,我强烈建议您下载WIX源代码,因为它也实现了自定义BA。

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

How to implement WiX installer upgrade?