C# 一个exe中有多个Windows服务
我正在尝试构建几个Windows服务来做不同的事情。例如,我需要的Windows服务将:C# 一个exe中有多个Windows服务,c#,windows,windows-services,C#,Windows,Windows Services,我正在尝试构建几个Windows服务来做不同的事情。例如,我需要的Windows服务将: 通过电子邮件发送每日报告 每隔30分钟定期清理一些存档信息 等等 我需要windows服务来完成的任务是不同的,所以我不太喜欢将它们全部放在一个服务中 到目前为止,我得到的是VisualStudio2008中的一个项目。我创建了一个windows服务,在OnStart事件上设置了一个计时器(为了测试目的,它每5秒写入一个文本文件)。然后我在项目中添加了一个安装程序,当我运行InstallUtil.exe时,
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。我想这就是你想要的,对吗?以下是我所做的:
享受吧 在一个可执行文件中安装两个不同且不相关的服务对我来说很有趣。虽然可以让它工作,但这并不意味着它是正确的 听上去,你需要在不同的时间间隔执行一些不同的任务,而你的任务可能是
static void Main(string[] args)
{
ServiceBase[] ServicesToRun = new ServiceBase[]
{
new Service1(),
new Service2()
};
ServiceBase.Run(ServicesToRun);
}