将 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 服务运行的主要内容,如果未能解决你的问题,请参考以下文章

.NET 控制台应用程序作为 Windows 服务

由 C# 中的 Windows 服务托管的 COM+ 组件,用于控制外部设备

C# 控制台应用程序计时器问题

如何用C#编程操作Windows系统服务

使用 Visual Studio 2019 将 FileSystemWatcher 作为 Windows 服务

C# - 从 Windows 服务启动 Windows 窗体 [重复]