与Windows服务相同的应用程序的多个实例?

NVR*_*RAM 7 c# windows-services

我有一个应用程序来管理我的项目的繁重处理,并需要将其转换为"Windows服务".我需要允许运行应用程序处理的多个版本实例,这似乎是一个相当正常的要求.

我可以看到至少三种方法来做到这一点:

  1. 创建一个已安装的目录(EXE,DLL,config),但要从中安装多个Services实例.
  2. 有一个单一的服务实例启动,一拉阿帕奇产卵后自身的多个实例.
  3. 让一个Services实例生成多个在同一进程空间内工作的线程.

我的意图是方法#1,但我一直在设计和特别是服务文档的限制上绊倒:

  • 参数是否通过无人值守系统上的常规服务机制传递给OnStart()?如果是的话,何时/为何?
  • 通过ImageKey注册表传递运行时参数似乎是一个问题,是否有更好的机制?
  • 我得到应用程序安装/卸载自己作为一对服务("XYZ#1","XYZ#2",...),使用ImageKey交给命令行参数实例编号(" - x 1") ," - x 2")但我遗失了一些东西.尝试启动该服务时,它将失败," 此服务配置为运行的可执行程序未实现该服务.

所以,问题:

  1. 是否有关于服务启动时会发生什么的简明描述,特别是对于ServiceName未进行硬编码的情况(参见上面的Q).
  2. 有没有人成功使用方法#1?任何意见?

注意:我通过使用方法#3来解决这个问题,所以我无法证明这一点.但我认为有人可能有关于如何实施#1的信息 - 或者很好的理由为什么它不是一个好主意.

[编辑]我最初有一个第四个选项(在硬盘上安装应用程序的多个副本),但我删除它,因为它只是感觉,嗯,hackish.这就是我说" 至少有三种方法 "的原因.

但是,除非重新编译应用程序,否则它必须动态设置其ServiceName,因此它具有上述第三个项目符号/问题的解决方案.因此,除非需要更改其安装文件的实例,否则#1应该可以正常使用目录中的N个配置文件和指示实例应该使用的注册表项.

csh*_*net 6

虽然我无法回答您对选项#1的具体问题,但我可以告诉您,选项#2对我们来说非常有效.我们希望为每个"子"服务创建一个应用程序域,以便在每个"子"服务下运行并为每个子服务使用不同的配置文件.在我们的服务配置文件中,我们存储了要启动的应用程序域以及要使用的配置文件.因此,对于每个条目,我们只需创建应用程序域,设置配置文件等,然后关闭.这种配置分离使我们能够轻松地为每个实例唯一地指定端口和日志文件位置.我们的另一个好处是我们将"子服务"编写为命令行exe,并在每个"子"服务的新线程上简单地调用AppDomain的ExecuteAssembly().解决方案中唯一的"笨拙"是关闭,我们没有打算为它创建一个"好"的解决方案.

2012年2月更新

前段时间我们开始使用"命名"服务(如SQL Server).我在博客的"构建Windows服务 - 第1 部分第7部分 " 系列中详细介绍了整个过程.它们将指导您完成自行安装的命令行/ Windows服务混合.满足以下目标:

  • 构建也可以从控制台使用的服务
  • 正确记录服务启动/关闭和其他活动的事件
  • 通过使用命令行参数允许多个实例
  • 自行安装服务和事件日志
  • 正确记录服务异常和错误的事件
  • 控制启动,关闭和重启选项
  • 处理自定义服务命令,电源和会话事件
  • 自定义服务安全性和访问控制

构建Windows服务 - 第7部分:完成触摸系列的最后一篇文章中提供了完整的Visual Studio项目模板.