0

我有一个 Windows 服务(用 .NET 编写),为此我使用 WiX 3.7 构建了一个安装程序。它充当基础架构角色,任何人都可以编写另一个使用它的 Windows 服务。由于我的服务需要在任何其他此类服务使用它时运行,所以其他服务的安装程序在安装期间将我的服务定义为它们的“服务依赖项”。

不幸的是,即使其他服务依赖于 Windows 服务,Windows 似乎也允许删除它。我想让我的安装程序出错,并且当该机器上仍安装任何其他依赖服务时无法卸载我的服务。

我不知道会在我的基础上构建什么其他服务,所以我无法对任何检查进行硬编码。

有没有办法用 WiX 做到这一点?

4

1 回答 1

1

如果有其他服务正在使用您的服务,请编写自定义操作并使卸载失败。

OpenSCManager+ EnumServicesStatusEx(查找所有服务) + OpenService+ QueryServerConfig(查找依赖项)

自定义操作应设置一个 WiX 变量(例如“SERVICE_IS_USED”),然后使用 Condition 元素对其进行测试:

  <Condition Message ="Stop using me first!">
    SERVICE_IS_USED = "0"
  </Condition>

(实际上,我会添加其他条件,因此这仅适用于卸载期间,并且我会认真考虑允许 FORCE 选项以允许卸载,即使该服务正在使用中。

我建议用 C 或 C++ 而不是 .Net 编写自定义操作——在 .Net 中运行自定义操作的引导过程让我感到害怕。

如果您还没有安装程序的 boostrapper 来安装依赖项,如 .Net 框架和 C 运行时库,我会更进一步,建议以不使用 C 运行时库的方式用 C 编写自定义操作(只需Windows API 调用)。

PS 顺便说一句,我认为这与 .Net 并没有真正的关系——它更多的是 windows-services、wix 和 windows-installer

于 2013-09-24T14:49:48.183 回答