我创建了一个自动启动的Windows服务。此服务在启动时连接到数据库服务。问题是数据库服务似乎是在我的服务之后启动的。是否有一种编程方式来定义此依赖项,以便在数据库服务启动后启动我的服务。
我发现这篇文章http://www.boyce.us/windows/servertipcontent.asp?ID=7讨论了添加注册表项来做到这一点。我想知道是否有C#方式来做到这一点?
更新
添加上述问题。这是另一种情况。使用installshied安装服务,不需要projectinsaller。似乎installshield查找从ServiceBase类派生的类并安装每个服务。如何在这种情况下添加依赖项?
答案 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))
});