Wix 安装程序在卸载时不删除文件

Wix installer is not removing files when uninstalling

我正在为我的设置添加一项新功能时发现某些功能不再有效。

我有一个由组件组成的可选功能,即安装在应用程序文件夹中的 activex 和安装在另一个文件夹中的各种 dll,但是当卸载时,activex 是应用程序文件夹中唯一保留的文件,过滤器也是留在他们单独的文件夹中。

这曾经很好地卸载了 ActiveX 和 dll,并在卸载结束时删除了这两个文件夹。

我花了几个小时重命名 ActiveX 的所有 guid(重新生成一个 .wxs 文件)和类似文章中建议的所有 dll,但无济于事!

我就是不明白,我的应用程序被删除了,我的 windows 服务被停止并删除了,等等...但是 activex 和这些 dll 不会被删除!

我注意到有问题的文件的操作设置为空。首先在功能部分,连接activex和dlls的那个是空的,但是另外两个没问题!

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

如您所见,Actions 都是 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,并且可以找到 none .

另一篇文章提到这可能是由于 dll 的引用计数,并且可能是 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。

现在的问题好像和这个有关。当我进行测试时,我通过了安装我的 activex 和过滤器的 INCLUDEFILTERS=1,但我猜当你调用卸载时,它不知道该值并使用默认值,即 0,因此什么都不做。

基于以上,我不得不假设卸载它时会以某种方式查看功能树并检查它是否被选中。

我可以检测到 INCLUDEFILTERS 在安装时设置为 1 并在卸载时将内部变量重置为 1 吗?我应该在 CDATA 中使用 'Installed' 还是有另一种方法来实现这个?

老实说,我什至不确定知道这个值是否会有所作为,但现在我假设它会。

我会继续尝试 CDATA 中的 'Installed' 条件,然后我会更新我的答案。

谢谢。

在日志中搜索每个空操作组件的 GUID。 Windows 记录离开组件的原因。安装到 Windows 和 Windows 系统目录的文件通常是永久性的,以缓解 Orca 中的 DLL hell. You can check for permanent components in your WiX authoring or your .msi's Component table

这确实与我对这个特定功能的条件有关。如前所述,在安装时,我提供了一个命令行参数来包含 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>

很遗憾花了好几个小时才弄明白这么简单的一行代码!!希望这会对其他人有所帮助!