Wixsharp 微星。如何卸载组件之间不共享的文件并将共享的文件留在目录中?

Wixsharp MSI. How to uninstall files that are not shared between components and leave those that are shared in dir?

我有 10 个服务,它们共享一些相同的 .dll-s。当我安装这些服务时,dll-s 安装在同一个文件夹中,并且共享的那些不重复(这是我想要的),但是当我卸载这些服务时。假设服务编号 5,msi 还卸载该服务的所有 dll-s,包括共享的。我怎样才能只卸载每个服务不共享的那些?

One Line Answer: You must make sure that the shared files are not assigned to single features only - as this will remove them on uninstall if no other features register them as "clients" or "users" of the files.


长版:您必须具备多项功能,因为您允许单独安装和卸载服务。 您是否可能仅将一些共享组件/文件分配给一个功能?如果是这样,那么可能会出现上述问题。有几个选项:

  1. 共享功能:也许创建一个隐藏的公共功能并将所有共享组件/文件移到那里?然后您可以从 GUI 中隐藏它,这样它们就不会被卸载,直到完全卸载整个产品。最终用户永远无法 select 卸载它们(msiexec.exe 命令仍然可以卸载它们,除非你也禁止它)。

  2. 更新所有功能:您还应该能够将所有共享组件添加到每个功能因此每个功能都列出了所有共享文件以及各个服务文件。我更喜欢如上所述的共享隐藏功能。但是,如果您希望在卸载个别服务时某些共享文件消失,则可以将组件/文件添加到 那些(服务)功能。由于该功能被卸载,没有其他功能报告“我需要那些文件”并且文件被卸载。

  3. Burn:只是提到您可以为每个服务提供一个单独的 MSI,并为共享文件提供一个共享 MSI使用 Burn 引导程序/包。根据您上面的评论,这不是您想要做的。但是,这确实允许您更新单个服务而无需重新编译包含所有服务的大型设置:Use a single setup or several smaller ones?(并且还可以更新公共文件,而无需重新编译所有服务设置)。

以上第 2 点为例:如果您卸载服务 1、2 和 3,并且它们是唯一指向某些共享文件的服务,则这些共享文件将在最后一个使用它的服务获取时被卸载已卸载。