Msi卸载不会删除程序功能中的产品条目

时间:2013-02-01 11:33:44

标签: wix windows-installer

我正在使用WiX 3.6创建一个复制一些exe和dll的msi,安装一些Windows服务并添加和删除一些注册表项。

WiX非常出色,并且在相关的.net托管dll中使用它内置的功能和自定义操作,我已经能够非常轻松地完成所需的一切。

最近发生了一个恼人的问题。

安装没有任何错误,并且完全符合我的预期,但是当我从“程序功能”控制面板或命令行卸载时,产品条目仍保留在“程序功能”列表中。所有其他文件,服务和文件夹都按预期删除,卸载完成且未报告错误!

如果我再次运行卸载,则会删除“程序功能”条目!

我使用了安装和卸载的详细日志记录,并通过平台SDK中的Windows Installer详细日志分析器查看,并且它没有报告任何错误。

我很困惑!

我确信它之前正在卸载,但我无法确定我做了什么让它开始表现出这种行为。

任何想法都会受到赞赏。

PS我在Windows 7 64位计算机上运行,​​并生成32位安装程序。

PPS日志太大,无法包含在此处。任何人都可以建议我需要查看哪些条目来控制从“程序功能”列表中删除条目?

进一步澄清;

我已经检查了下面克里斯托弗答案中的链接,但情况与我的情况不符。

首次卸载后,该条目将从“程序功能”列表中消失,但如果刷新,则会重新出现在列表中,或退出控制面板并返回到该列表。注册表项仍然存在(我已经检查过),所以这就是它仍然出现在列表中的原因。

第二次卸载会从注册表中删除该条目,因此也会从列表中删除。

3 个答案:

答案 0 :(得分:1)

这是添加/删除程序(Windows Shell团队)中的错误。如果您关闭或刷新ARP,您应该会看到您的条目消失。您的MSI(Windows Installer团队)可能没有任何问题。

结帐:

Why does my program still show up in the Programs and Features folder after my uninstaller exits?

这是与WiX相关的主题:

http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/quot-Add-Remove-Programs-quot-doesn-t-refresh-sometimes-td6918973.html

顺便说一下,你实际上并没有第二次运行卸载程序。您只需单击卸载按钮,此时ARP将实现“哦不再存在”并将其删除。实际上并没有调用卸载。

答案 1 :(得分:1)

我已经回顾了我最近对msi所做的更改,并发现我所做的更改导致卸载行为奇怪。

我创建了一个删除一些旧注册表项的功能,我只需要在初始安装期间执行此操作,因此我在该功能上添加了一个条件,如下所示;

<Feature Id="RegistryEntries" Level="0">
        <Condition Level="1">(NOT Installed)</Condition>
        <ComponentRef Id="RegKeysToDelete"/>
</Feature>

如果我没有条件,msi会按预期安装和卸载。

根据上述条件,它会正确安装并删除注册表项,但卸载会在“添加删除程序”中保留该条目,我需要再次卸载才能将其完全删除。

如果我使用以下条件,则msi按预期安装和卸载;

<Feature Id="RegistryEntries" Level="0">
        <Condition Level="1">(NOT Installed) OR REMOVE ~= "ALL"</Condition>
        <ComponentRef Id="RegKeysToDelete"/>
</Feature>

我最初没有满足卸载的需要,因为我不需要在卸载时使用这些注册表项执行任何操作。虽然这解决了我遇到的问题,但我不明白为什么第一个不评估为1的条件导致msi没有按预期卸载,但我想这是另一个问题...

请参阅MSDN主题Condition Table (Windows)(备注部分)

  

应仔细选择条件,以便不启用某项功能   在安装上然后在卸载时禁用。这将是孤儿   功能和产品将无法卸载。

答案 2 :(得分:0)

这不是一个真正的“答案”,而是放置一些我从重大编辑日志中看到的文物的地方:

首次运行:

(STATE)MSI(B4:3C)[09:18:48:395]:功能:StartServices;已安装:本地;要求:无效;行动:空

(州)MSI(B4:3C)[09:18:48:395]:特征:配置;已安装:本地;要求:缺席;行动:缺席

(州)MSI(B4:3C)[09:18:48:395]:特征:数据库;已安装:本地;要求:缺席;行动:缺席

(州)MSI(B4:3C)[09:18:48:395]:功能:RegistryEntries;已安装:本地;要求:无效;行动:空虚 (国家)MSI(B4:3C)[09:18:48:395]:特征:可执行文件;已安装:本地;要求:缺席;行动:缺席 (州)MSI(B4:3C)[09:18:48:395]:特征:完成;已安装:本地;要求:缺席;行动:缺席 (国家)MSI(B4:3C)[09:18:48:395]:特征:服务;已安装:本地;要求:缺席;行动:缺席 (状态)MSI(B4:3C)[09:18:48:395]:特征:DLL;已安装:本地;要求:缺席;行动:缺席

第二次运行:

(STATE)MSI(48:0C)[09:33:17:664]:功能:StartServices;安装:缺席;要求:无效;行动:空虚 (状态)MSI(48:0C)[09:33:17:664]:特征:配置;安装:缺席;要求:无效;行动:空虚 (州)MSI(48:0C)[09:33:17:664]:特征:数据库;安装:缺席;要求:无效;行动:空虚 (状态)MSI(48:0C)[09:33:17:664]:功能:RegistryEntries;安装:缺席;要求:无效;行动:空虚 (州)MSI(48:0C)[09:33:17:664]:特征:可执行文件;安装:缺席;要求:无效;行动:空虚 (州)MSI(48:0C)[09:33:17:664]:特征:完成;安装:缺席;要求:无效;行动:空虚 (国家)MSI(48:0C)[09:33:17:664]:特征:服务;安装:缺席;要求:无效;行动:空虚 (状态)MSI(48:0C)[09:33:17:664]:特征:DLL;安装:缺席;要求:无效;行动:空

底线是我不确定。第一个日志表示已安装某些特征而未请求删除。第二个日志说没有安装功能,也没有请求。我有点难过,在第二个日志中,每个功能如何说它没有安装,但我们有一个安装要删除。

要么这是我从未见过的新事物,要么日志被严重编辑或者不能代表他们意外误导的情况。