将 C# 控制台应用程序作为 Windows 服务运行
Posted
技术标签:
【中文标题】将 C# 控制台应用程序作为 Windows 服务运行【英文标题】:Running a C# console application as a Windows service 【发布时间】:2011-06-03 01:08:33 【问题描述】:我有一个基本的 C# 控制台应用程序,我想将它作为 Windows 服务运行。
我已经使用sc create
创建了 Windows 服务。这很好,我可以在services.msc
下看到我的服务。当我尝试启动此服务时,出现以下错误:
无法在本地计算机上启动 PROJECT 服务。错误 1053:服务没有及时响应启动或控制请求。`
我了解到这可能是由于服务代码的执行时间超过 30000 毫秒。因此,我删除了大部分代码,因此几乎没有执行任何操作..但同样的错误仍然存在。
我在这个项目中使用 .NET 3.5。
这是什么原因造成的?
【问题讨论】:
你的流程真的开始了吗?我怀疑它无法启动, ***.com/questions/593454/… 【参考方案1】:您不能只使用任何控制台应用程序并作为 Windows 服务运行。首先,您需要实现从ServiceBase
继承的服务类,然后在入口点(Main
)中,您需要使用ServiceBase.Run(new YourService())
运行服务。在您的服务类中,您需要定义服务开始和结束时会发生什么。
理想情况下,您也应该将 ServiceInstaller 添加到您的程序集中。这样您就可以预设您的服务属性,并使用 installutil.exe 来安装服务。
【讨论】:
@WulfgarPro - 因为 Windows 服务应用程序的架构略有不同。您需要定义服务开始和结束时要做什么。 有一些工具可以让您将控制台应用程序作为服务运行而无需修改。比如这个:runasservice.com【参考方案2】:Walkthrough: Creating a Windows Service Application in the Component Designer 是如何创建服务的演练。
【讨论】:
【参考方案3】:任何旧应用程序都不能作为服务运行,尤其是在较新版本的 Windows 下。他们应该支持某些功能,响应某些请求,并且(同样,在最新版本的 Windows 下)不直接与用户交互。
如果您需要服务,请编写专门设计为服务的应用程序。
【讨论】:
【参考方案4】:我不知道“sc create”是什么。但我知道,使用 Visual Studio 2010,可以构建一个 Windows 服务项目。顺便说一句,我创建了一个这样的项目,它一直运行良好。
【讨论】:
sc create
是安装 Windows 服务的方法,即使您的程序集中没有安装程序。【参考方案5】:
为什么会这样? – wulfgar.pro 2011 年 6 月 3 日 1:13
@WulfgarPro - 因为 Windows 服务应用程序有一点 不同的架构。您需要定义服务开始和结束时要做什么。 – Alex Aza 2011 年 6 月 3 日 1:15
(很遗憾我还不能写评论。) 这是因为SCM(Service Control Manager)通过ServiceBase Class控制服务槽。如果只需要定义它在启动和停止时的作用,那么就不需要继承和覆盖。可以简单地创建这两种方法。不幸的是,由于 ServiceBase 包含更多功能,因此涉及更多工作。
【讨论】:
【参考方案6】:我在TopShelf 上取得了巨大的成功。这是一个 nuget 包,它允许您的 .NET 控制台应用程序还具有必要的 Windows 服务挂钩,以便它可以愉快地作为控制台应用程序(对调试有用)运行,或作为 Windows 服务安装。
【讨论】:
以上是关于将 C# 控制台应用程序作为 Windows 服务运行的主要内容,如果未能解决你的问题,请参考以下文章
由 C# 中的 Windows 服务托管的 COM+ 组件,用于控制外部设备