C# 一个exe中有多个Windows服务

C# 一个exe中有多个Windows服务,c#,windows,windows-services,C#,Windows,Windows Services,我正在尝试构建几个Windows服务来做不同的事情。例如,我需要的Windows服务将: 通过电子邮件发送每日报告 每隔30分钟定期清理一些存档信息 等等 我需要windows服务来完成的任务是不同的,所以我不太喜欢将它们全部放在一个服务中 到目前为止,我得到的是VisualStudio2008中的一个项目。我创建了一个windows服务,在OnStart事件上设置了一个计时器(为了测试目的,它每5秒写入一个文本文件)。然后我在项目中添加了一个安装程序,当我运行InstallUtil.exe时,

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

  • 通过电子邮件发送每日报告
  • 每隔30分钟定期清理一些存档信息
  • 等等
  • 我需要windows服务来完成的任务是不同的,所以我不太喜欢将它们全部放在一个服务中

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

    当我向同一个项目添加第二个windows服务时,问题就出现了。我使用相同的日志信息再次设置了OnStart代码(略有不同,这样我就可以知道哪个服务正在写入日志)。使用第二个windows服务,我将Program.cs中的主事件从:

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

    此时,没有编译时错误,但Service2服务从未执行任何操作……日志任务从未启动

    我把范围缩小到第二个服务没有与之相关联的“安装程序”。然后,我尝试像第一个服务那样添加安装程序(即,右键单击服务设计器,然后单击“添加安装程序”)。现在,当我转到ProjectInstaller.cs文件时,那里有另一个serviceInstaller(serviceInstaller2)

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

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

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

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


    为了让两个服务从一个exe运行,我缺少了什么吗?

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

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

    在我的例子中,每个程序还包含一个usercontrol,它被加载到控制器的选项卡页中,允许用户控制/修改它。如果你感兴趣的话,我会发布代码


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

    我今天遇到了一个类似的问题,并设法解决了它

    首先,我确保每个服务都有一个有意义且唯一的ServiceName属性。生成器为这两个服务提供了相同的名称,这是没有帮助的

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


    我现在可以用一个dll安装这两个服务,但不幸的是,当我启动其中一个服务时,它似乎同时执行自身和另一个服务的功能。也就是说,两个服务都在运行(即使只有一个服务在计算机管理器中显示为“已启动”)。我仍在努力解决这个问题……

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

    我认为发生此错误只是因为名称不匹配


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

    我已经想出了如何使用一个可执行文件,而不是两个服务。每个服务都以其自己的名称和启动/停止功能安装到service manager。我想这就是你想要的,对吗?以下是我所做的:

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


    享受吧 在一个可执行文件中安装两个不同且不相关的服务对我来说很有趣。虽然可以让它工作,但这并不意味着它是正确的

    听上去,你需要在不同的时间间隔执行一些不同的任务,而你的任务可能是
        static void Main(string[] args)
        {
            ServiceBase[] ServicesToRun = new ServiceBase[] 
            { 
                new Service1(),
                new Service2()
            };
    
            ServiceBase.Run(ServicesToRun);
        }