在 Windows 服务启动之间创建依赖关系

Posted

技术标签:

【中文标题】在 Windows 服务启动之间创建依赖关系【英文标题】:create dependency between windows services startup 【发布时间】:2011-07-06 18:23:39 【问题描述】:

我创建了一个设置为自动启动的 Windows 服务。该服务在启动时连接到数据库服务。问题是数据库服务似乎在我的服务之后启动。是否有一种编程方式来定义这种依赖关系,以便我的服务在数据库服务启动后启动。

我发现这篇文章http://www.boyce.us/windows/servertipcontent.asp?ID=7 谈到了添加一个注册表项来做到这一点。我想知道是否有 C# 方法可以做到这一点?

更新:

补充上述问题。这是另一种情况。正在使用不需要 projectinsaller 的 installshied 安装服务。似乎 installshield 查找派生自 ServiceBase 类的类并安装每个服务。这种情况下如何添加依赖?

【问题讨论】:

【参考方案1】:

您正在为项目的 ServiceInstaller 组件寻找 ServiceInstaller.ServicesDependedOn Property。

来自文章的备注部分(我将您感兴趣的部分加粗):

一项服务可能需要其他服务 在它可以开始之前运行。这 来自该属性的信息是 写入注册表中的一个键。什么时候 用户(或系统,在这种情况下 的自动启动)尝试运行 服务,服务控制管理器 (SCM)验证每个 阵列中的服务已经 开始了。

如果数组中的任何服务不是 然后运行,单片机尝试启动 他们。这包括服务 手动启动类型

如果此服务基于任何服务 依赖无法启动,此服务 不会启动。例外不是 如果系统未启动则抛出 因为没有异常处理 在系统级别检测到这一点。 决定如何处理服务启动 失败并在你的 代码。通常,会出现一个对话框 如果服务失败,用户在启动时 开始。

如果服务没有启动,一个 条目被写入应用程序 事件日志。

此服务所基于的服务 依赖不需要在同一个 可执行文件。

【讨论】:

@stack:很抱歉,自从我使用 InstallShield 已经有一段时间了(而且当我这样做时,它不是用于 Windows 服务),所以恐怕我不能会有很大帮助。我确实尝试谷歌它并想出了this,这可能会有所帮助!【参考方案2】:

除了 Jay Riggs 的回答之外,以下是您应该添加到 serviceinstaller 以使您的服务依赖于事件日志的示例

Me.ServiceInstaller1.ServiceName = "Service1";
Me.ServiceInstaller1.ServicesDependedOn = new string[] "EventLog";

当然,如果您有其他服务依赖项,请将“Eventlog”更改为其他内容..

【讨论】:

【参考方案3】:

我使用 advapi32.dll,因为我可以完全控制安装。我的服务注册自己,设置描述(虽然我使用 sc.exe),设置依赖关系,设置失败时重启(也使用 sc.exe)等。

ChangeServiceConfig2 API 应该设置描述,但在 .NET 中似乎不起作用

依赖由 CreateService API 设置..

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
internal static extern UIntPtr CreateService(UIntPtr SC_HANDLE, string lpSvcName, string lpDisplayName,
        uint dwDesiredAccess, uint dwServiceType, uint dwStartType, uint dwErrorControl, string lpPathName,
        string lpLoadOrderGroup, string lpdwTagId, string lpDependencies, string lpServiceStartName, string lpPassword);

【讨论】:

以上是关于在 Windows 服务启动之间创建依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

更新后服务不启动;如何做组件之间的依赖关系

windows无法启动server服务(位于本地计算机上)错误1068;依赖服务或组无法启动

windows无法启动server服务(位于本地计算机上)错误1068;依赖服务或组无法启动

具有依赖关系的 Windows 服务的关闭顺序 [关闭]

Spring04-----DI

使用不同的启动级别来管理 OSGi 包之间的依赖关系是不是合理?