0

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

4

1 回答 1

0

单行答案:您必须确保共享文件不只分配给单个功能 - 因为如果没有其他功能将它们注册为文件的“客户端”或“用户”,这将在卸载时删除它们。


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

  1. 共享功能:也许创建一个隐藏的通用功能并将所有共享组件/文件移到那里?然后,您可以将其从 GUI 中隐藏,以便在完全卸载整个产品之前不会卸载它们。最终用户永远不能选择它们进行卸载(msiexec.exe命令仍然可以卸载它们,除非您也禁止这样做)。

  2. 更新所有功能:您还应该能够将所有共享组件添加到每个功能,以便每个功能列出除单个服务文件之外的所有共享文件。我更喜欢如上所述的共享隐藏功能。但是,如果您希望在卸载单个服务时删除某些共享文件,则可以仅将组件/文件添加到那些(服务)功能。随着该功能被卸载,没有其他功能报告“我需要这些文件”并且文件被卸载。

  3. 刻录:只是提到您可以使用刻录引导程序/捆绑包为每个服务提供单独的 MSI 和共享文件的共享 MSI。根据您上面的评论,这不是您想要做的。但是,这确实允许您更新单个服务,而无需重新编译包含所有服务的大型设置:使用单个设置还是几个较小的设置?(以及更新公共文件,无需重新编译所有服务设置)。

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

于 2020-11-28T02:01:57.720 回答