推荐一款将控制台程序部署到Windows服务的组件

  • 推荐一款将控制台程序部署到Windows服务的组件已关闭评论
  • 51 次浏览
  • A+
所属分类:.NET技术
摘要

在日常开发中,有时候需要将我们的程序随着操作系统一起运行,并且无需人工干预。要实现这种效果,有很多种方法,比如:如果是桌面程序,可以设置到程序的启动项;如果是Web程序,还可以托管到IIS中,而对于控制台程序,最常见在做法是将程序部署成Windows服务,并设置成自动运行,这样当操作系统开机时,就会自动启动。在.NET程序中,如何将控制台程序,部署成Windows服务中呢?本文以一个简单的小例,简述如何利用一款第三方插件(Topshelf)将控制台程序部署成Windows服务的相关方法及步骤。

在日常开发中,有时候需要将我们的程序随着操作系统一起运行,并且无需人工干预。要实现这种效果,有很多种方法,比如:如果是桌面程序,可以设置到程序的启动项;如果是Web程序,还可以托管到IIS中,而对于控制台程序,最常见在做法是将程序部署成Windows服务,并设置成自动运行,这样当操作系统开机时,就会自动启动。在.NET程序中,如何将控制台程序,部署成Windows服务中呢?本文以一个简单的小例,简述如何利用一款第三方插件(Topshelf)将控制台程序部署成Windows服务的相关方法及步骤。

 

什么是Topshelf?

 

Topshelf是一款开源的用于托管.NET编写的应用程序到Windows服务的框架,通过Topshelf,可以非常方便的将普通控制台应用程序,转换成Winodw服务,并注册到Windows服务控制管理器(SCM)中。

 

示例说明

 

Windows服务一般都是周期性重复运行的,并不会停止。在本示例中,主要是为了演示创建Windows服务的方法及功能框架,实现功能是每隔一秒钟,输入一段话到日志文件中,以便于查看。

 

创建控制台应用程序

 

首先创建一个控制台应用程序,以及一个普通的类(AppService),此类包含Start和Stop方法,以及Work方法,具备一个服务的基本功能。如下所示:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;  namespace DemoWinService {     /// <summary>     /// 程序运行主体     /// </summary>     internal class AppService     {         private CancellationTokenSource cts;         private CancellationToken token;         private Task bgtask;          public AppService()         {             this.cts = new CancellationTokenSource();             this.token = cts.Token;         }          /// <summary>         /// 开始         /// </summary>         public void Start()         {             Logger.Info("DemoWinService程序开始运行");              this.bgtask = Task.Run(() =>             {                 while (!this.token.IsCancellationRequested)                 {                     try                     {                         this.Work();                     }                     catch (Exception ex)                     {                      }                     finally                     {                         Sleep(1000);                     }                 }              });         }          /// <summary>         /// 运行         /// </summary>         public void Work()         {             Logger.Info($"{DateTime.Now.ToString("当前时间为:yyyy-MM-dd HH:mm:ss")}程序正在运行...");         }          /// <summary>         /// 停止         /// </summary>         public void Stop()         {             cts.Cancel();             if(this.bgtask != null)             {                 this.bgtask.Wait(1000);             }             Logger.Info("DemoWinService程序结束运行");         }          /// <summary>         /// 线程等待         /// </summary>         /// <param name="milliseconds"></param>         private void Sleep(int milliseconds)         {             int times = 10;             if (milliseconds <= 1000)             {                 times = 10;             }             else if (milliseconds > 1000 && milliseconds <= 10000)             {                 times = 20;             }             else if (milliseconds > 10000 && milliseconds <= 100000)             {                 times = 40;             }             else             {                 times = 60;             }             for (int i = 0; i < times; i++)             {                 if (token.IsCancellationRequested)                 {                     return;                 }                 Thread.Sleep(milliseconds / times);             }         }     } }

 

安装Topshelf组件

 

在Visual Studio开发工具中,可以通过Nuget包管理器进行安装,如下所示:

推荐一款将控制台程序部署到Windows服务的组件

 

配置注册Windows服务

 

在Program的Main方法中,通过HostFactory的Run方法,注册Windows服务,如下所示:

using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using Topshelf;  namespace DemoWinService {     internal class Program     {         public static void Main(string[] args)         {             var rc = HostFactory.Run(x =>             {                 x.Service<AppService>(s =>                 {                     s.ConstructUsing(name => new AppService());                     s.WhenStarted(tc => tc.Start());                     s.WhenStopped(tc => tc.Stop());                 });                 x.RunAsLocalSystem();                 x.StartAutomatically();                 x.SetDescription(ConfigurationManager.AppSettings["Description"]);                  x.SetDisplayName(ConfigurationManager.AppSettings["DisplayName"]);                 x.SetServiceName(ConfigurationManager.AppSettings["ServiceName"]);             });              var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());              Environment.ExitCode = exitCode;         }     } }

 其中服务名称和描述信息,在配置文件(App.config)中,方便修改。

<?xml version="1.0" encoding="utf-8" ?> <configuration> 	<appSettings> 		<add key="Description" value="测试Windows服务"/> 		<add key="ServiceName" value="DemoWinService"/> 		<add key="DisplayName" value="DemoWinService"/> 	</appSettings> </configuration>

 

服务安装

 

当程序开发完成后,将编译后的程序放置在服务器上指定的目录,然后【以管理员运行】打开命令行窗口,找到程序目录,通过以下命令进行安装:

可执行程序.exe install

 示例如下所示:

推荐一款将控制台程序部署到Windows服务的组件

 

启动停止服务

 

安装成功后,即可在Windows服务管理器中,进行启动或者停止 ,如下所示:

 

推荐一款将控制台程序部署到Windows服务的组件

 

程序输出日志,表示服务正常运行:

 

推荐一款将控制台程序部署到Windows服务的组件

 

服务卸载

 

当服务不再使用时,可以通过如下命令卸载服务:

可执行程序.exe uninstall

 

示例如下所示:

推荐一款将控制台程序部署到Windows服务的组件

 

Topshelf源码

 

Topshelf是一款开源框架,其源码是托管到Github中,如下所示:

GitHub源码:https://github.com/Topshelf/Topshelf

推荐一款将控制台程序部署到Windows服务的组件

 

以上就是【推荐一款将控制台程序部署到Windows服务的组件】的全部内容,希望可以抛砖引玉,一起学习,共同进步。