我有一个包含很多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!我设法在玩具程序中重新创建问题,所以,希望解决这个问题应该很多更简单!
先生。阿斯穆尔,我感谢你的兴趣。但是,我解决了这个问题。我犯了一个非常非常愚蠢的错误,我很尴尬地承认。可以说我已经追了两天自己的尾巴而且花了我的雇主钱,因为......好吧,我小时候就掉到了我的头上,因此我没有太明亮。
答案 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元素)。