一个exe中的多个Windows服务

dp.*_*dp. 25 c# windows windows-services

我正在尝试构建几个Windows服务来做不同的事情.例如,我需要Windows服务,它将:

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

我需要Windows服务的任务是不同的,所以我不喜欢将它们全部集中在一个服务中的想法.

到目前为止我所拥有的是Visual Studio 2008中的一个项目.我已经创建了一个Windows服务,我在OnStart事件上设置了一个计时器(它只是为了测试目的每5秒写一个文本文件).然后我向项目添加了一个安装程序,当我运行InstallUtil.exe时,一切正常.

当我向同一个项目添加第二个Windows服务时,问题就出现了.我再次设置OnStart代码,使用相同的日志信息(略有不同,以便我可以判断哪个服务正在写入日志).使用第二个Windows服务,我在Program.cs中更改了Main事件:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1()
        };

        ServiceBase.Run(ServicesToRun);
    }
Run Code Online (Sandbox Code Playgroud)

至:

    static void Main(string[] args)
    {
        ServiceBase[] ServicesToRun = new ServiceBase[] 
        { 
            new Service1(),
            new Service2()
        };

        ServiceBase.Run(ServicesToRun);
    }
Run Code Online (Sandbox Code Playgroud)

此时,没有编译时错误,但Service2服务从不做任何事情......日志记录任务永远不会触发.

我把它缩小到第二个服务没有与之关联的"安装程序"的事实.然后,我尝试按照第一项服务的方式添加安装程序(即,右键单击服务设计器,然后单击"添加安装程序").现在,当我转到ProjectInstaller.cs文件时,那里有另一个serviceInstaller(serviceInstaller2).

现在当我构建项目并尝试安装服务时,我转到"服务"控制面板窗口,我尝试启动Service1,收到以下错误消息:

Windows无法在本地计算机上启动Service1服务.

错误1083:此服务配置为运行的可执行程序未实现该服务.

如果我尝试启动Service2,则会收到相同的错误消息(当然,错误消息标识Service2除外).

为了从一个exe运行两个服务,我有什么遗漏吗?

Sco*_*ott 15

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

  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/

请享用!


小智 5

我想你们已经解决了这个问题,但是如果其他人需要它,我会在这个问题上给出答案,这个问题今天花了我几个小时.解决方案不是添加另一个项目安装程序,而是添加服务安装程序,它是项目安装程序上的一个组件.新添加的服务安装程序必须配置第二个服务名称.


Ste*_*ers 1

我实际上正在构建与您的想法非常相似的东西。我决定做的(到目前为止)是让我的所有“服务”(尽管它们不是服务,一个“控制器”是)实现一个特定的接口(还有 init() 和execute() 操作)作为频率枚举)。

控制器是 Windows 服务,它在运行时从 xml 设置文件读取程序/dll 列表,并将它们加载到列表中,并以它们定义的任何频率调用它们的execute() 方法(如果适用)。

就我而言,每个程序还包含一个用户控件,该控件加载到控制器的选项卡页中,允许用户控制/修改它。如果您有兴趣,我将发布代码。

不确定这是否清楚。实际上,我从另一个实现了类似功能的 SO 用户那里得到了这个想法,但我现在找不到那个帖子了。