2011-03-01 152 views
18

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

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

更新:

添加到上面的问题。这是另一种情况。这些服务正在使用installshied进行安装,而不需要projectinsaller。看来installshield会查找派生自ServiceBase类的类并安装每个服务。如何在这种情况下添加依赖项?

回答

26

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

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

服务可能需要其他服务 来运行,才可以启动。来自此属性的 信息是写入注册表中的一个键的 。当 用户(或系统的情况下自动启动的 )试图运行 服务,服务控制管理器 (SCM)验证每个阵列中的 服务已是 开始。

如果阵列中的任何服务 运行以后,SCM尝试启动 他们。这包括 手册StartType的服务。

如果此服务 所依赖的任何服务无法启动,则此服务 将不会启动。如果系统未启动,则会抛出异常 ,因为系统级没有异常处理 来检测此情况。 决定如何处理服务启动 失败并在您的 代码中执行此操作。通常情况下,如果服务启动失败 ,用户在启动时会出现一个对话框 。

如果该服务没有启动,则将 条目写入应用程序 事件日志。

,这便是服务 取决于不需要在同一 可执行的服务。

+0

+1 - 我想说什么;) – Oded 2011-03-01 19:31:53

+0

你可以请。回复编辑的问题。谢谢。 – stackoverflowuser 2011-03-01 20:33:04

+0

@stack:我很遗憾地说,自从我使用InstallShield(并且当我这么做的时候,它不适用于Windows服务)已经有一段时间了,所以我恐怕没有太大的帮助。我确实尝试Google,并提出了[this](http://community.installshield.com/showthread.php?t=162302&page=4),这可能会有所帮助! – 2011-03-01 20:53:55

2

除了周杰伦里格斯的回答,这里是和例子,你应该添加到的ServiceInstaller什么使依赖于事件日志

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

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