0

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

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

不过,最近开始出现一个烦人的问题。

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

如果我再次运行卸载,程序功能条目将被删除!

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

我很困惑!

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

任何想法,将不胜感激。

PS 我在 Windows 7 64 位机器上运行,并生成一个 32 位安装程序。

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

进一步澄清;

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

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

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

4

3 回答 3

3

我回顾了我最近对 ​​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 主题条件表 (Windows)(备注部分)

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

于 2013-02-05T16:17:11.283 回答
1

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

查看:

为什么卸载程序退出后我的程序仍显示在“程序和功能”文件夹中?

这是一个与 WiX 相关的线程:

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

顺便说一句,您实际上并没有第二次运行卸载程序。您只需单击卸载按钮,此时 ARP 会意识到“哦,它不再存在”并被删除。卸载实际上并没有被调用。

于 2013-02-01T12:18:35.043 回答
0

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

第一次运行:

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

(STATE) MSI (s) (B4:3C) [09:18:48:395]:功能:配置;安装:本地;请求:缺席;行动:缺席

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

(STATE) MSI (s) (B4:3C) [09:18:48:395]:特征:RegistryEntries;安装:本地;请求:空;行动:空(状态)MSI(s)(B4:3C)[09:18:48:395]:功能:可执行文件;安装:本地;请求:缺席;行动:缺席 (STATE) MSI (s) (B4:3C) [09:18:48:395]:特征:完成;安装:本地;请求:缺席;行动:缺席 (STATE) MSI (s) (B4:3C) [09:18:48:395]:特征:服务;安装:本地;请求:缺席;行动:缺席 (STATE) MSI (s) (B4:3C) [09:18:48:395]:特征:DLL;安装:本地;请求:缺席;行动:缺席

第二轮:

(STATE) MSI (s) (48:0C) [09:33:17:664]:功能:StartServices;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:配置;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:数据库;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:RegistryEntries;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:可执行文件;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:完成;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:服务;已安装:不存在;请求:空;行动:空(状态)MSI(s)(48:0C)[09:33:17:664]:功能:DLL;已安装:不存在;请求:空;行动:空

底线是我不确定。第一个日志说安装了某些功能并且没有被要求删除。第二个日志说没有安装这些功能,也没有提出请求。对于第二个日志中的每个功能如何说它未安装但我们有一个安装要删除,我有点难过。

要么这是我从未见过的新事物,要么日志被大量编辑或无法代表情况,以至于它们会意外误导。

于 2013-02-05T13:11:26.217 回答