c# - 一个 exe 中的多个 Windows 服务

标签 c# windows windows-services

我正在尝试构建多个 Windows 服务来执行不同的操作。例如,我需要 Windows 服务将:

  1. 通过电子邮件发送每日报告
  2. 每 30 分钟定期清理一些归档信息
  3. 等等

我需要 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 运行,我是否遗漏了什么?

最佳答案

我已经弄清楚如何拥有一个可执行文件和两个服务。每个服务都以自己的名称和启动/停止能力安装到服务管理器。我想这就是你想要的,对吗?这是我所做的:

  1. 创建了一个服务项目。
  2. 向同一个项目添加了第二个服务(具有唯一的服务名称)。
  3. 为两种服务(ServiceA 和 ServiceB)添加了安装程序。
  4. 在 ProjectInstaller.Designer.vb 文件中,我更改了 Me.Installers.AddRange 行以显示两个服务安装程序。 (Me.ServiceInstaller1, Me.ServiceInstaller2)
  5. 在主要服务(在我的示例中为 ServiceA)的主要入口点中,我将 ServicesToRun 变量设置为一个 ServiceBase 数组,其中包含我希望它运行的所有服务(ServiceA 和 ServiceB)。这是一个重要的步骤,因为服务管理器根据此处的参数数量设置属性 - 允许同一 exe 的多个实例或仅允许一个实例。
  6. 添加安装程序项目并使用服务的输出。
  7. 使用服务的输出添加自定义操作。

您可以在此处找到演示代码:
http://code.google.com/p/multi-service-install/

尽情享受吧!

关于c# - 一个 exe 中的多个 Windows 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/816437/

相关文章:

c# - Visual Studio 先决条件下载失败,HRESULT=-2146697208

c++ - "An existing connection was forcibly closed by the remote host"监听传入数据时

c# - WPF Windows 程序以大字体显示但仅在一台 PC 上显示

c# - RabbitMQ 消费者

c# - MS Windows 服务和 https

c# - 将信号从一台计算机上的 ASP.NET 应用程序传递到另一台计算机上的 .NET Windows 服务的最佳方法是什么?

c# - 根据另一个列表或不同大小对列表进行排序

c# - 具有 CancellationTokenSource 的 channel 在处理后出现超时内存泄漏

c# - 值转换器。强制 WPF 只调用一次

c++ - 无法使用 fopen() 在 Windows 7 的 C 盘中创建文件