将C#控制台应用程序作为Windows服务运行

7
我有一个基本的C#控制台应用程序,我想将其作为Windows服务运行。
我使用“sc create”创建了Windows服务。这个命令很好用,我可以在“services.msc”下看到我的服务。但是当我尝试启动这个服务时,我会得到以下错误:
“无法在本地计算机上启动PROJECT服务。错误1053:服务没有及时响应启动或控制请求。”
我读到说这可能是由于服务代码执行时间超过30000毫秒导致的。因此,我删除了大部分代码,以便几乎没有任何代码被执行...但是相同的错误仍然存在。
我正在使用.NET 3.5进行此项目。
这是什么原因呢?

你的进程真的启动了吗?我怀疑它没有成功启动。 - zdan
https://dev59.com/cHRB5IYBdhLWcg3wiHv7#593803 - Matt Davis
6个回答

9
您不能将任何控制台应用程序直接作为Windows服务运行。首先,您需要实现继承自ServiceBase的服务类,然后在入口点(Main)中使用ServiceBase.Run(new YourService())来运行服务。在您的服务类中,您需要定义服务启动和结束时发生的情况。
最好也将ServiceInstaller添加到您的程序集中。这样,您就可以预设您的服务属性,并使用installutil.exe安装该服务。

1
@WulfgarPro - 因为Windows服务应用程序具有稍微不同的架构。您需要定义服务启动和结束时要执行的操作。 - Alex Aza
2
有一些工具可以让你在不修改程序的情况下将控制台应用程序作为服务运行。例如这个网站:http://runasservice.com - Luis Perez

3

0

我不知道"sc create"是什么。但是我知道,使用Visual Studio 2010,可以构建一个Windows服务项目。顺便说一下,我已经创建了这样的一个项目,并且它一直运行得很好。


sc create 是一种安装 Windows 服务的方法,即使您的程序集中没有安装程序。 - Alex Aza

0

并非所有旧应用程序都可以作为服务运行,特别是在较新版本的Windows下。它们需要支持某些功能,响应某些请求,并且(同样,在较新版本的Windows下)直接与用户交互。

如果您想要一个服务,请编写一个专门设计为服务的应用程序。


0
为什么会这样?- wulfgar.pro Jun 3 '11 at 1:13 @WulfgarPro - 因为Windows服务应用程序具有稍微不同的架构。您需要定义服务启动和结束时要执行的操作。- Alex Aza Jun 3'11 at 1:15
(很遗憾,我还不能发表评论。)这是因为SCM(服务控制管理器)通过ServiceBase类控制服务。如果只需要定义它在启动和停止时要做什么,那么就不需要继承和覆盖。可以简单地创建这两种方法。不幸的是,这涉及到更多的工作,因为ServiceBase包含更多的功能。

0

我在使用TopShelf时取得了巨大的成功。这是一个NuGet包,它允许您的.NET控制台应用程序具有必要的Windows服务钩子,以便它可以愉快地作为控制台应用程序运行(用于调试),或安装为Windows服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接