【发布时间】:2009-09-02 22:45:29
【问题描述】:
我有一个应用程序管理我的项目的繁重处理,需要将其转换为“Windows 服务”。我需要允许运行应用程序处理的多个 versions 实例,这似乎是一个相当正常的要求。
我可以看到至少三种方法可以做到这一点:
- 创建单个安装目录(EXE、DLL、配置),但作为多个 Services 实例安装。
- 让单个 Services 实例在启动后生成多个自身实例,例如 Apache。
- 让单个 Services 实例产生多个在同一进程空间中工作的线程。
我的意图是方法#1,但我一直在克服限制,无论是在设计方面,尤其是在服务的文档方面:
- 参数曾经是否通过无人值守系统上的正常服务机制传递给OnStart()?如果是,何时/为什么?
- 通过 ImageKey 注册表传递运行时参数似乎很麻烦,有没有更好的机制?
- 我让应用程序安装/卸载自己作为一对服务(“XYZ #1”,“XYZ #2”,...),使用 ImageKey 给它一个命令行参数实例编号(“-x 1”,“-x 2”),但我遗漏了一些东西。尝试启动该服务时,它会失败并显示“此服务配置为在其中运行的可执行程序没有实现该服务。
所以,问题:
- 是否有关于服务启动时发生的情况的简明描述,特别是对于那些 ServiceName 没有硬编码的情况(参见上面的 Q)。
- 有没有人成功使用方法#1?有cmets吗?
注意:我已经通过使用方法 #3 绕过了这个问题,所以我无法证明花太多时间来解决这个问题。但我认为有人可能有关于如何实施 #1 的信息——或者说它不是一个好主意的充分理由。
[编辑]我最初有第 4 个选项(在硬盘驱动器上安装应用程序的多个副本),但我删除了它,因为它只是感觉,嗯,hackish .这就是为什么我说“至少三种方法”。
但是,除非重新编译应用程序,否则它必须动态设置其 ServiceName,因此可以解决上述第三个项目符号/问题。因此,除非实例需要更改它的安装文件,否则#1 应该可以正常使用目录中的 N 个配置文件和指示实例应该使用哪个注册表项。
【问题讨论】:
标签: c# windows-services