C# Windows Service服务开发的简单实现(Topshelf)

it2022-05-05  115

概念:(Copyed From 百科)

Windows服务是指Windows NT操作系统中的一种运行在后台的计算机程序。它在概念上类似于Unix守护进程。Windows服务必须匹配服务控制管理器(负责管理Windows服务的组件)的接口规则和协议。

 

Windows服务可以配置为在操作系统启动时运行,并且在Windows运行期间持续在后台运行。服务也可以手动或基于某个事件而启动。Windows NT操作系统包含众多服务,分别运行在三种用户帐户环境中:系统、网络服务和本地服务。这些Windows组件通常采用Windows服务托管进程。因为Windows服务运行在其自身的专用用户帐户中,它们可以在用户未登录时活动。

 

在Windows Vista之前,安装为“交互服务”的服务可以与Windows桌面交互和显示图形用户界面。但在Windows Vista中,交互服务已被弃用,并且可能无法正常运行。

 

要求:

.netFramework必须在4.5.2版本以上(这是Topshelf的要求,不是所有Windows Service的要求)。

编者使用VS2019进行演示:

 

实现步骤:

1.新建一个Windows项目,最好直接建立控制台程序(.netFramework 4.5.2),项目命名为:DeamonLogService。

 

 

 

2.引入管理NUGet程序包:

方法:引用->管理NUGet程序包

 

浏览->搜索:Topshelf->选择对应版本号,点击安装。

 

我使用的版本号为:4.2.1。如果项目的版本是.netframework 4.5.2版本一下的,可以使用Topshelf的更低版本(ps具体实验我没做过,读者自行完善)。

 

 

3.新建DeamonLog类,该类通过定时器(你也可以自己使用其他方式实现),来实现服务开启之后,进行进程日志存储。其实现如下:

using System; using System.IO; using System.Timers; namespace DeamonLogService {     /// <summary>     /// 进程日志     /// </summary>     public class DeamonLog     {         /// <summary>         /// 定时器         /// </summary>         private readonly Timer timer;         /// <summary>         /// 建立一个日志服务         /// </summary>         public DeamonLog()         {             // 初始化定时器(1s执行一次,重复)             timer = new Timer(1000) { AutoReset = true, };             // 绑定定时器处理事件             timer.Elapsed += Timer_Elapsed;         }         /// <summary>         /// 定时器处理事件         /// </summary>         /// <param name="sender"></param>         /// <param name="e"></param>         private void Timer_Elapsed(object sender, ElapsedEventArgs e)         {             string[] lines = new string[] { DateTime.Now.ToString() };             File.AppendAllLines(@"C:\Deamon\DeamonLog.txt", lines);             // TODO:在我们的服务中进行处理的事情。         }         /// <summary>         /// 开启日志服务         /// </summary>         public void Start()         {             timer.Start();         }         /// <summary>         /// 停止日志服务         /// </summary>         public void Stop()         {             timer.Stop();         }     } }

 

4.在主函数Main中,初始化和绑定服务到主机的服务进程中;设置服务基本信息和处理方式;获取服务结束时的退出代码(exitCode),当服务结束服务时,退出进程。

using System; using Topshelf; namespace DeamonLogService {     class Program     {         static void Main(string[] args)         {             // 通过Topshelf获取程序退出的代码             var exitCode = HostFactory.Run(x =>             {                 // 初始化和绑定服务                 x.Service<DeamonLog>(s =>                 {                     s.ConstructUsing(log => new DeamonLog());                     s.WhenStarted(log => log.Start());                     s.WhenStopped(log => log.Stop());                 });                 // 设置服务为本地系统                 x.RunAsLocalSystem();                 // 设置服务的名称和描述                 x.SetServiceName("DeamonLogService");                 x.SetDisplayName("Deamon Log Service");                 x.SetDescription("This is sample deamon log service used by Mef Deamon");             });             // 将退出代码转换成Int值,并赋值给Environment.ExitCode,当服务关闭时,退出程序             int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode());             Environment.ExitCode = exitCodeValue;         }     } }

至此,编码结束,接下来进行服务的开启和使用。在此之前,我们首先测试下,我们程序是否正常运行。

 

5.测试功能

按F5运行程序:

控制台会出现以下消息,说明成功了:

 

然后我们查看以下日志文件,我设置的路径为:C:\Deamon\DeamonLog.txt。(ps:如果路径中不存在某个文件夹,存储不成功)。

6.服务安装与卸载

通过命令行进行安装。

(1)把我们的可执行文件放到我们能访问的文件内(演示中文件路径为:C:\Deamon\DeamonLog)。

(2)打开命令行:cmd

 

(3)启用服务:

a.进入文件夹:cd C:\Deamon\DeamonLog

b.初始化服务:DeamonLogService.exe install start

打开Windows服务进行检查。

我们可以通过右键进行开启或关闭服务。

(4)卸载服务:

1.进入文件夹:cd C:\Deamon\DeamonLog

2.卸载服务:DeamonLogService.exe uninstall

卸载之后,DeamonLogSeevice就不在了。

源码地址:https://download.csdn.net/download/youyomei/11383719

Over

每次记录一小步...点点滴滴人生路..


最新回复(0)