在Windows服务启动之间创建依赖关系
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Windows服务启动之间创建依赖关系相关的知识,希望对你有一定的参考价值。
我创建了一个设置为自动启动的Windows服务。此服务在启动时连接到数据库服务。问题是数据库服务似乎是在我的服务之后启动的。是否有一种编程方式来定义此依赖项,以便在数据库服务启动后启动我的服务。
我发现这篇文章http://www.boyce.us/windows/servertipcontent.asp?ID=7谈到添加一个注册表项来做到这一点。我想知道是否有C#方式来做到这一点?
更新:
添加到上面的问题。这是另一种情况。使用installshied安装服务,不需要projectinsaller。似乎installshield查找从ServiceBase类派生的类并安装每个服务。如何在这种情况下添加依赖项?
您正在为项目的ServiceInstaller组件寻找ServiceInstaller.ServicesDependedOn Property。
从文章的备注部分(我加粗了你感兴趣的部分):
服务可以在启动之前要求其他服务运行。此属性的信息将写入注册表中的密钥。当用户(或系统,在自动启动的情况下)尝试运行服务时,服务控制管理器(SCM)会验证阵列中的每个服务是否已经启动。
如果阵列中的任何服务未运行,则SCM会尝试启动它们。这包括具有Manual StartType的服务。
如果此服务所依赖的任何服务无法启动,则此服务将无法启动。如果未启动系统,则不会引发异常,因为系统级别没有异常处理来检测此情况。确定如何处理服务启动失败并在代码中实现此操作。通常,如果服务无法启动,则会在启动时向用户显示一个对话框。
如果服务未启动,则会将一个条目写入应用程序事件日志。
此服务所依赖的服务不需要在同一个可执行文件中。
除了Jay Riggs的回答之外,还有你应该添加到serviceinstaller以使你的服务依赖于事件日志的例子和示例
Me.ServiceInstaller1.ServiceName = "Service1";
Me.ServiceInstaller1.ServicesDependedOn = new string[] {"EventLog"};
当然,如果您有其他服务依赖项,请将“Eventlog”更改为其他内容。
我使用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服务启动之间创建依赖关系的主要内容,如果未能解决你的问题,请参考以下文章
对 system() 的调用不会在我的 Windows 进程之间创建父子关系
windows无法启动server服务(位于本地计算机上)错误1068;依赖服务或组无法启动