我正在尝试构建多个 Windows 服务来执行不同的操作。例如,我需要 Windows 服务将:
- 通过电子邮件发送每日报告
- 每 30 分钟定期清理一些归档信息
- 等等
我需要 Windows 服务完成的任务是不同的,所以我不太喜欢将它们全部放在一个服务中的想法。
到目前为止我得到的是 Visual Studio 2008 中的一个项目。我创建了一个 Windows 服务,我在 OnStart 事件上设置了一个计时器(它只是每 5 秒写入一个文本文件以进行测试目的)。然后,我向项目添加了一个安装程序,当我运行 InstallUtil.exe 时,一切正常。
当我向同一个项目添加第二个 Windows 服务时,问题就出现了。我再次设置 OnStart 代码,使用相同的日志信息(略有不同,因此我可以判断哪个服务正在写入日志)。对于第二个 Windows 服务,我将 Program.cs 中的主事件从:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1()
};
ServiceBase.Run(ServicesToRun);
}
到:
static void Main(string[] args)
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2()
};
ServiceBase.Run(ServicesToRun);
}
此时,没有编译时错误,但 Service2 服务从未执行任何操作...日志记录任务从未触发。
我将其缩小到第二个服务没有与之关联的“安装程序”这一事实。然后,我尝试按照对第一个服务所做的方式添加安装程序(即,右键单击服务设计器,然后单击“添加安装程序”)。现在,当我转到 ProjectInstaller.cs 文件时,那里有另一个 serviceInstaller (serviceInstaller2)。
现在,当我构建项目并尝试安装服务时,我转到“服务”控制面板窗口,并尝试启动 Service1,我收到以下错误消息:
Windows could not start the Service1 service on the Local Computer.
Error 1083: The executable program that this service is configured to run in does not implement the service.
如果我尝试启动 Service2,我也会收到相同的错误消息(当然,错误消息标识 Service2 除外)。
为了让两个服务从一个 exe 运行,我是否遗漏了什么?
最佳答案
我已经弄清楚如何拥有一个可执行文件和两个服务。每个服务都以自己的名称和启动/停止能力安装到服务管理器。我想这就是你想要的,对吗?这是我所做的:
- 创建了一个服务项目。
- 向同一个项目添加了第二个服务(具有唯一的服务名称)。
- 为两种服务(ServiceA 和 ServiceB)添加了安装程序。
- 在 ProjectInstaller.Designer.vb 文件中,我更改了 Me.Installers.AddRange 行以显示两个服务安装程序。 (Me.ServiceInstaller1, Me.ServiceInstaller2)
- 在主要服务(在我的示例中为 ServiceA)的主要入口点中,我将 ServicesToRun 变量设置为一个 ServiceBase 数组,其中包含我希望它运行的所有服务(ServiceA 和 ServiceB)。这是一个重要的步骤,因为服务管理器根据此处的参数数量设置属性 - 允许同一 exe 的多个实例或仅允许一个实例。
- 添加安装程序项目并使用服务的输出。
- 使用服务的输出添加自定义操作。
您可以在此处找到演示代码:
http://code.google.com/p/multi-service-install/
尽情享受吧!
关于c# - 一个 exe 中的多个 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816437/