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

概念:(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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值