多个Windows服务在一个EXE

我正在试图build立几个Windows服务来做不同的事情。 例如,我需要Windows服务,将:

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

我需要Windows服务做的任务是截然不同的,所以我不太喜欢把它们都放在一个服务中的想法。

我到目前为止是Visual Studio 2008中的一个项目。我已经创build了一个Windows服务,我已经在OnStart事件上设置了一个计时器(它只是为了testing目的每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服务从不做任何事情…日志logging任务不会触发。

我将其缩小到第二个服务没有与之关联的“安装者”的事实。 然后,我尝试按照第一个服务的方式添加安装程序(即,右键单击服务devise器,然后单击“添加安装程序”)。 现在,当我去到ProjectInstaller.cs文件,那里有另一个serviceInstaller(serviceInstaller2)。

现在,当我build立项目,并尝试安装服务,我去“服务”控制面板窗口,我尝试启动Service1,我得到以下错误信息:

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

错误1083:此服务被configuration为运行的可执行程序不执行该服务。

如果我尝试启动Service2,也会得到相同的错误消息(当然,错误消息标识Service2的情况除外)。

有没有什么我想要从一个EXE运行两个服务运行?

Solutions Collecting From Web of "多个Windows服务在一个EXE"

我已经想出了如何有一个可执行文件,但两个服务。 每个服务都以自己的名字安装到服务管理器,并可以启动/停止。 我想这就是你想要的,对吗? 这是我做的:

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

你可以在这里找到演示代码:
http://code.google.com/p/multi-service-install/

请享用!

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

我今天有类似的问题,并设法解决它。

首先,我确定每个服务都有一个有意义且唯一的ServiceName属性。 发电机给了两个服务相同的名称,这将不会有帮助。

然后,我删除并重新生成了ProjectInstaller类,并为每个类添加了安装程序。 我确定它们都是在静态Main方法中实例化的。

我现在可以安装这两个服务与一个DLL,但不幸的是,当我启动其中一个服务似乎执行本身和其他服务的功能。 也就是说,两个服务都在运行(即使在计算机管理器中只有一个服务显示为“已启动”)。 我仍然试图找出一个…

我实际上正在构建与你所想的非常相似的东西。 我决定做的(迄今为止)是所有我的'服务'(虽然他们不是服务,一个'控制器')是实现一个特定的接口(与init()和execute()操作作为FREQUENCY枚举)。

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

在我的情况下,每个程序还包含一个用户控件,它被加载到控制器的标签页中,允许用户控制/修改它。 如果你有兴趣,我会发布代码。

不知道是否清楚。 我其实从另一个SO用户那里得到了这个想法,他们实现了类似的东西,但我现在找不到这个帖子。

我用sc.exe来轻松完成。 http://support.microsoft.com/kb/251192

例如: sc create "My Display Service Name" binpath= "c:\app\mysvc.exe --service"

注意:每个相等的值都应该在它的值之前,因为你可以看到“binpath”

我今天有同样的问题,并设法解决这个问题。 在我的情况下,我只需要打开我的服务的* .designer.cs文件,并确保服务名称设置正确。 更重要的是,应该在* Installer.Designer.cs中使用相同的名称,如果你在* Installer.cs中有代码。

我认为这个错误只是由于名称不匹配而发生的。

希望这有助于

在一个可执行文件中安装2个独立和不相关的服务对我来说有一种有趣的味道 虽然有可能使它起作用,但它并不是正确的。

从听起来像,你需要在不同的时间间隔执行一些不同的任务,你的任务可能会或可能不相关。 你看过Quartz.NET吗? 这听起来很适合你的需求。

http://quartznet.sourceforge.net/features.html