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

问题描述 投票:22回答:3

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

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

更新:

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

c# windows .net-4.0 windows-services
3个回答
29
投票

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

从文章的备注部分(我加粗了你感兴趣的部分):

服务可以在启动之前要求其他服务运行。此属性的信息将写入注册表中的密钥。当用户(或系统,在自动启动的情况下)尝试运行服务时,服务控制管理器(SCM)会验证阵列中的每个服务是否已经启动。

如果阵列中的任何服务未运行,则SCM会尝试启动它们。这包括具有Manual StartType的服务。

如果此服务所依赖的任何服务无法启动,则此服务将无法启动。如果未启动系统,则不会引发异常,因为系统级别没有异常处理来检测此情况。确定如何处理服务启动失败并在代码中实现此操作。通常,如果服务无法启动,则会在启动时向用户显示一个对话框。

如果服务未启动,则会将一个条目写入应用程序事件日志。

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


3
投票

除了Jay Riggs的回答之外,还有你应该添加到serviceinstaller以使你的服务依赖于事件日志的例子和示例

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

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


0
投票

我使用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);
© www.soinside.com 2019 - 2024. All rights reserved.