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

时间:2009-09-02 22:45:29

标签: c# windows-services

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

我至少可以看到三种方法:

  1. 创建一个已安装的目录(EXE,DLL,config),但要从中安装多个 Services 实例。
  2. 启动后,让一个 Services 实例生成多个自身实例,即Apache。
  3. 让一个 Services 实例生成多个在同一进程空间内工作的线程。
  4. 我的意图是方法#1,但是我一直在设计和特别是服务的文档中限制这些限制:

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

    所以,问题:

    1. 是否有关于服务启动时会发生什么的简明描述,特别是对于 ServiceName 未进行硬编码的情况(参见上面的Q)。
    2. 有没有人成功使用方法#1?有什么意见吗?
    3. 注意:我通过使用方法#3来解决这个问题,所以我无法在很长时间内解决这个问题。但我认为有人可能有关于如何实施#1的信息 - 或者说这不是一个好主意的充分理由。

      [编辑] 我最初有第四个选项(在硬盘驱动器上安装应用程序的多个副本),但我删除了它,因为它只是感觉,嗯,hackish 。这就是为什么我说“至少有三种方法”。

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

3 个答案:

答案 0 :(得分:6)

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

2012年2月更新

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

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

完整的Visual Studio项目模板可在本系列的最后一篇文章Building a Windows Service – Part 7: Finishing touches中找到。

答案 1 :(得分:0)

答案 2 :(得分:0)

我在项目中成功使用了选项#4,即“命名实例”。

您应用的每次安装都有自定义名称,每个安装都有自己的服务。它们是完全独立的并且彼此隔离。如果您尝试在单台计算机上多次安装MS SQL Server,则MS SQL Server正在使用此模型。