当我注意到某些内容不再有效时,我正在为我的设置添加一项新功能。
我有一个可选功能,它由组件组成,即安装在应用程序文件夹中的activex和安装在另一个文件夹中的各种dll但是当卸载activex时,应用程序中只剩下一个文件了文件夹和过滤器也保留在其单独的文件夹中。
这用于卸载ActiveX和dll,并在卸载的最后删除了这两个文件夹。
我花了几个小时重新命名ActiveX的所有guid(用热量重新生成.wxs文件)和类似文章中建议的所有dll但无济于事!
我只是没有得到它,我的应用程序被删除,我的Windows服务被停止和删除等等......但是activex和这些dll却没有被删除!
我注意到有问题的文件将其操作设置为null。在功能部分的第一个,连接activex和dll的那个是null,而另外2个很好!
MSI (s) (C4:C0) [04:01:07:040]: Doing action: InstallValidate
MSI (s) (C4:C0) [04:01:07:040]: Note: 1: 2205 2: 3: ActionText
Action ended 04:01:07: KillAgentMonitor. Return value 1.
Action start 04:01:07: InstallValidate.
MSI (s) (C4:C0) [04:01:07:040]: PROPERTY CHANGE: Deleting
MsiRestartManagerSessionKey property. Its current value
is '86b17c5ff2f8de4d9424198f445cc8d1'.
MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature2; Installed: Absent;
Request: Null; Action: Null
MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature3; Installed: Local;
Request: Absent; Action: Absent
MSI (s) (C4:C0) [04:01:07:040]: Feature: Feature1; Installed:
Local; Request: Absent; Action: Absent
然后删除的文件:
MSI (s) (C4:C0) [04:01:07:040]: Component: CMP_File1;
Installed: Local; Request: Absent; Action: Absent
MSI (s) (C4:C0) [04:01:07:040]: Component: CMP_File2;
Installed: Local; Request: Absent; Action: Absent
然后是dll文件:
MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File53_DLL; Installed:
Local; Request: Null; Action: Null
MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File54_DLL; Installed:
Local; Request: Null; Action: Null
MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_File55_DLL; Installed:
Local; Request: Null; Action: Null
你可以看到动作都是空的吗?
最后是activex:
MSI (s) (C4:C0) [04:01:07:056]: Component: CMP_MyActiveX_DLL; Installed:
Local; Request: Null; Action: Null
也是空的!!
我的activex安装在c:\ program files(x86)\ mycompany \ client中,dll安装在c:\ windows \
中我还阅读了一些文章,其中可能出现此问题的原因之一是组件可能在注册表中留下了信息,但我检查了许多特定的随机GUID,但没有找到。
有人提到另一篇文章,这可能是由于dll的Ref计数,可能是这些是SharedDlls注册表,但不是这样。我已经检查了注册表中没有任何内容。
我也擦了我的VM并重建了一个新的但仍然没有好处。
我完全没有想到接下来我能做些什么。关于为什么动作为空的任何其他建议?
我应该在日志中查找特定内容吗?
感谢。
更新
我最终弄明白是什么导致了这个问题。它与任何建议的问题无关,即无效的GUID,更高版本,引用计数,在Windows文件夹中等等...
如果提供了命令行参数,即INCLUDEFILTERS = 1,则我的一个功能仅显示在功能树视图中,因为默认情况下这些参数未提供给所有客户端。
代码是:
<Feature Id="Feature2" Title="Filters" Level="10" Description="Select
this option to install optional filters" TypicalDefault="install"
InstallDefault="local">
<ComponentGroupRef Id="Feature2Components"/>
<!--<Condition Level="0">
<![CDATA[(INCLUDEFILTERS = 0)]]>
</Condition>-->
</Feature>
默认情况下,INCLUDEFILTERS为0,除非通过命令行提供并设置为1.
现在问题似乎与此有关。当我进行测试时,我传递了INCLUDEFILTERS = 1,它安装了我的activex和过滤器,但我想当你调用卸载时,它不知道该值并使用默认值即0,因此什么都不做。 / p>
基于以上所述,我必须假设在卸载它时会以某种方式查看功能树,并检查它是否被选中。
我可以在安装时检测到INCLUDEFILTERS设置为1并在卸载时将内部变量重置为1吗?我应该使用&#39;已安装&#39;在CDATA内还是有另一种方法来实现这一目标吗?
我说实话,我甚至不确定知道这个价值是否有所作为,但现在我假设它会。
我会继续尝试安装&#39; CDATA的条件,我会更新我的答案。
感谢。
答案 0 :(得分:2)
这确实与我对这个特定功能的条件有关。如上所述,在安装时,我提供了一个命令行参数来包含ActiveX和过滤器。卸载时,它没有检测到这个参数是在安装时传递的,所以要解决这个问题,我只是添加了另一个条件:
<Feature Id="Feature2" Title="Filters" Level="10" Description="Select
this option to install optional filters" TypicalDefault="install"
InstallDefault="local">
<ComponentGroupRef Id="Feature2Components"/>
<Condition Level="0">
<![CDATA[(INCLUDEFILTERS = 0)]]>
</Condition>
<Condition Level="10">
<![CDATA[(INCLUDEFILTERS = 1 OR (Installed AND NOT
UPGRADINGPRODUCTCODE))]]>
</Condition>
</Feature>
羞耻地花了几个小时来弄清楚这么简单的代码!希望这会对其他人有所帮助!
答案 1 :(得分:1)
在日志中搜索每个空操作组件的GUID。 Windows记录它离开组件的原因。安装到Windows和Windows系统目录的文件通常是永久性的,以缓解DLL hell。您可以检查WiX创作中的永久性组件或Orca中的.msi Component table。