WiX 在卸载时删除 LocalAppData (AppData\Local\my_app_folder)

WiX remove LocalAppData (AppData\Local\my_app_folder) on uninstall

我有一个 wix 安装项目,它创建了一个 ProgramMenu 快捷方式和一个桌面快捷方式。我可以使用 RemoveFolder.

删除这些快捷方式
<!-- To remove Desktop shortcut -->
<RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall"/>

<!-- To remove ProgramMenu shortcut-->
<RemoveFolder Id="CleanUpShortCut" Directory="ApplicationProgramsFolder" On="uninstall" />

然而,在卸载时,我也希望能够清除当前用户的LocalAppData。更具体地说,Users\CurrentUser\AppData\Local\my_application

到目前为止,我发现 RemoveFolder 不会递归删除文件,我必须使用 util:RemoveFolderEx。我是这样做的:

  <Directory Id="LocalAppDataFolder" Name="Local">
    <Directory Id="RemoveLocalData" Name="my_application">
      <Component Id="RemoveLocalAppData" Guid="PUT-GUID-HERE">
        <util:RemoveFolderEx On="uninstall" Property="RemoveLocalData"/>
        <RemoveFolder Id="RemoveLocalData" On="uninstall"/>
      </Component>
    </Directory>
  </Directory>

And I get this error:
ICE38: Component RemoveLocalAppData installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.

我想我没有正确使用 RemoveFolderEx,但我不知道在这种情况下清除 LocalAppData 的正确方法。

注意,我没有在安装过程中创建文件夹。相反,此 [LocalAppData]\my_application 是由应用程序在 post 安装时 运行 创建的。

在以下 link 的帮助下,最终设法删除了当前用户的 LocalAppData(缓存):https://pkisensee.wordpress.com/2015/10/06/windows-installer-removing-folders/

为了成功删除应用程序的 LocalAppData 文件夹,我必须在注册表中搜索(使用 RegistrySearch)应用程序缓存文件夹的位置并将其存储在 属性.

<Property Id="CACHEFOLDER">
     <RegistrySearch Key="Software\CompanyName\AppName" Root="HKCU" Type="raw"
                     Id="CacheFolderRegSearch" Name="CachePath" />
</Property>

但是,目前此注册表项不存在,因此无法解析路径。因此在安装过程中,我必须在注册表中保存 LocalAppData 缓存文件夹的位置,以便在卸载时,我可以执行 RegistrySearch 并通过 [=25= 递归删除缓存文件夹]util:RemoveFolderEx.

为此,我在组件中设置了 RegistryValue

<Directory Id="TARGETDIR" Name="SourceDir">

    <!-- ... -->

    <!-- This is the name of the cache folder in LocalAppData -->
    <!-- In this case the cache folder is in \Users\CurrentUser\AppData\Local\MyAppCache -->
    <?define AppCacheFolder = "MyAppCache" ?>
    <Component Id="CacheCleanup" Guid="*">
         <RegistryValue Root="HKCU" Key="Software\CompanyName\AppName" Name="CachePath" 
                        Type="string" Value="[LocalAppData]$(var.AppCacheFolder)"                   
                        KeyPath="yes" />
         <util:RemoveFolderEx On="uninstall" Property="CACHEFOLDER"/>
    </Component>

    <!-- ... -->

</Directory>

Note that this is done within the TARGETDIR directory

最后,需要将该组件注册到 Feature

<Feature Id="MainApplication" Title="App Name" Level="1">
    <!-- Other Components -->
    <ComponentRef Id="CacheCleanup" />
</Feature>