我正在使用WiX 3.6创建一个复制一些exe和dll的msi,安装一些Windows服务并添加和删除一些注册表项。
WiX非常出色,并且在相关的.net托管dll中使用它内置的功能和自定义操作,我已经能够非常轻松地完成所需的一切。
最近发生了一个恼人的问题。
安装没有任何错误,并且完全符合我的预期,但是当我从“程序功能”控制面板或命令行卸载时,产品条目仍保留在“程序功能”列表中。所有其他文件,服务和文件夹都按预期删除,卸载完成且未报告错误!
如果我再次运行卸载,则会删除“程序功能”条目!
我使用了安装和卸载的详细日志记录,并通过平台SDK中的Windows Installer详细日志分析器查看,并且它没有报告任何错误。
我很困惑!
我确信它之前正在卸载,但我无法确定我做了什么让它开始表现出这种行为。
任何想法都会受到赞赏。
PS我在Windows 7 64位计算机上运行,并生成32位安装程序。
PPS日志太大,无法包含在此处。任何人都可以建议我需要查看哪些条目来控制从“程序功能”列表中删除条目?
进一步澄清;
我已经检查了下面克里斯托弗答案中的链接,但情况与我的情况不符。
首次卸载后,该条目将从“程序功能”列表中消失,但如果刷新,则会重新出现在列表中,或退出控制面板并返回到该列表。注册表项仍然存在(我已经检查过),所以这就是它仍然出现在列表中的原因。
第二次卸载会从注册表中删除该条目,因此也会从列表中删除。
答案 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相关的主题:
顺便说一下,你实际上并没有第二次运行卸载程序。您只需单击卸载按钮,此时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;安装:缺席;要求:无效;行动:空
底线是我不确定。第一个日志表示已安装某些特征而未请求删除。第二个日志说没有安装功能,也没有请求。我有点难过,在第二个日志中,每个功能如何说它没有安装,但我们有一个安装要删除。
要么这是我从未见过的新事物,要么日志被严重编辑或者不能代表他们意外误导的情况。