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

时间:2011-03-01 19:21:04

标签: c# windows .net-4.0 windows-services

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

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

更新

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

3 个答案:

答案 0 :(得分:29)

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

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

  

服务可能需要其他服务   在它开始之前运行。该   这家酒店的信息是   写入注册表中的密钥。什么时候   用户(或系统,在这种情况下   自动启动)尝试运行   服务,服务控制管理器   (SCM)验证每个   数组中的服务已经存在   启动。

     

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

     

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

     

如果服务未启动,请执行   条目写入应用程序   事件日志。

     

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

答案 1 :(得分:3)

除了Jay Riggs的回答之外,这里有一个例子,你应该添加到serviceinstaller中以使你的服务依赖于事件日志

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

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

答案 2 :(得分:0)

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

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

依赖关系是由CreateService API设置的。

    const findUserByUsername = username => new Promise((resolve, reject) => {
      if (!username) return reject('A username must be provided');
      const queryRegex = new RegExp('^' + username + '$', 'i');
      User.find({ username: queryRegex }).exec().then(results => {
        if (results.length) return reject('This username already exists...');
        return resolve(username);
     }, error => reject(error))
    });