多个Windows服务在一个exe

问题描述:

我想建立几个Windows服务来做不同的事情。举例来说,我需要的Windows服务,这将:多个Windows服务在一个exe

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

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

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

当我向同一个项目添加第二个Windows服务时,问题就出现了。我再次设置了OnStart代码,使用相同的日志信息(略有不同,所以我可以知道哪些服务正在写入日志)。

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

     ServiceBase.Run(ServicesToRun); 
    } 

到:随着第二窗口服务,我在Program.cs中从改变的主要事件

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

     ServiceBase.Run(ServicesToRun); 
    } 

在这一点上,没有编译时错误,但客服2服务从来不会任何事情......日志记录任务不会触发。

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

现在,当我生成项目,并尝试安装的服务,我去“服务”控制面板窗口,我尝试启动服务1,我收到以下错误信息:

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

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

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

有没有什么我失踪,为了得到两个服务运行从一个exe?

+0

有什么特别的原因,而不是其他的“我想”,你需要在单个可执行文件中提供服务?通常情况下,模块化将是可取的,但您可能有其他需要的情有可原的情况。 – bsneeze 2009-05-03 06:10:19

+0

唯一真正的原因是便于安装和部署。所有的“服务”都是相当快的功能,所以我不希望为小块代码安装x个windows服务。 – 2009-05-04 02:52:42

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

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

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

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

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

首先,我确信,每个服务有一个有意义的和独特的ServiceName属性。发电机给了两个服务相同的名称,这没有任何帮助。

我然后取出并再生的ProjectInstaller类,并增加安装为每个类。我确信它们都是在静态Main方法中实例化的。

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

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

我觉得这个错误的发生只是因为名称不匹配。

希望这helpds

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

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

  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/

享受!

在一个可执行文件中安装2个不同和不相关的服务对我来说有一种有趣的味道。尽管可以使其发挥作用,但它并没有做到正确。

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

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

我用SC.EXE轻松地做到这一点。 http://support.microsoft.com/kb/251192

对于前:sc create "My Display Service Name" binpath= "c:\app\mysvc.exe --service"

注:每个等于应该有空间它的价值之前,你可以看到“binpath”