如何做个自己想要的Window的服务了?

前言说明

  • 使用工具:VS2019
  • 思考为什么要使用Window服务,它能做什么了?(后面解答)

一:什么是Window服务?(我们做的是一个什么东西?)

        Microsoft Windows 服务(过去称为 NT 服务)允许用户创建可在其自身的 Windows 会话中长时间运行的可执行应用程序。(微软爸爸是这么解释,简单介绍)
        我的理解,它就是一个挂载在我们系统上的服务,我们系统上服务其实有很多,比如我们的Sql数据库的服务:MSSQLSERVER,这个是启动数据库的一个服务,开启这个服务我们才能连接本地的安装的SQL。那WindowService应该也是一个这样的服务,可以理解是一个可以让我们自定义开发的服务。

二:如何创建WindowService?(我们知道是什么东西,怎么做?)

1.打开VS2019,类别选择服务,选择Windows服务类别

2.添加安装程序



安装之后,目录会添加新文件

2.1看看这两个文件
serviceInstaller1:


用的多的属性:

  • DelayedAutoStart:是否自动启动
  • Descrition:介绍服务(自定义)
  • DisplayName:标识服务器友好名称(自定义)
serviceProcessInstaller1:

  • Account:设置为LocalSystem(运行此服务的账户类型)

到此,一个服务就写好,只是他还没有任何灵魂(业务逻辑)

三:怎么编写我们的业务逻辑?(在哪里注入我们的灵魂)

3.1打开Service1类,按F7进入代码界面,如下图所示:


当前类有3个方法:

  • Service1:构造函数
  • OnStart:启动服务时会触发的方法(可以传递参数)
  • OnStop:结束服务时会触发的方法

3.2我们在OnStart和OnStop进行日志打印,代码如下:

  public Service1()
        {
            InitializeComponent();
            eventLog1 = new System.Diagnostics.EventLog();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
        }

        protected override void OnStart(string[] args)
        {
            eventLog1.WriteEntry("In OnStart.");
            LogHelper.loginfo.Info("In OnStart.");
        }

        protected override void OnStop()
        {
            eventLog1.WriteEntry("In OnStop.");
            LogHelper.loginfo.Info("In OnStop.");
        }

这里,我使用两种日志进行打印我们的日志信息

  • EventLog:这个是系统自带一个控件(也是微软教程中使用的日志记录)
  • log4net:这个是一个第三方库日志程序集

看看效果:

Eventlog:(日志数量有限制,超过一定的数量就不会在显示了)

log4net:(自定义,想怎么存,怎么存【推荐】)

四:编写好的服务,如何安装?(安装发动机)

4.1首先编译程序(快捷键:CtrL+Shift+B),生成项目

4.2找到目标文件

  • 右键项目,选择在文件资源管理器中打开文件夹
  • 找到Debug文件夹下面后缀为****.exe程序
  • 赋值路径:绝对路径,类是于:[D:****.exe]
  • 看看路径【C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019允许启动

4.3 在打开的CMD【就是上面打开的Developer Command Prompt for VS 2019程序,不是我们Win+R打开的】中,输入命令:

InstallUtil.exe C:\**\test\bin\Debug\test.exe


如上图标识已经安装成功!

五:安装好,如何启动?(点火启动)

输入命令:

net start 你定义的服务的名称【二:如何创建WindowService=>2.添加安装程序=>DisplayName】

如上图表示启动成功

六:不想用了,如何停止?(关火休息)

输入命令:

net stop 你定义的服务的名称【二:如何创建WindowService=>2.添加安装程序=>DisplayName】

如上图表示关闭成功

七:不想要了,如何卸载?(拆掉发动机)

输入命令:

InstallUtil.exe /u C:\**\test\bin\Debug\test.exe

如上图表示卸载成功

1.找到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019 启动

2.输入InstallUtil.exe D:\**\**.exe,回车安装服务

3.输入:net start SundyService (启动服务)

4.输入:net stop SundyService (停止服务)

5.输入InstallUtil.exe /u  D:\**\**.exe 卸载服务

八:参考文档

创建 Windows 服务应用

九:总结

我为什么要做这个WindwoService,是公司需要做一个运维软件,需要编写一个Windows服务,我也是看着官方文档学习的,业务逻辑比较简单, 开发也挺快的。
自己对Window服务理解,我们其实这种服务也是一个程序,只是它集成到Windows系统服务中,这样有一个好处,可以设置开机自动启动,而且还神不知鬼不觉,在客户电脑上安装,客户也不知道,我们是做运维监控,不是干坏事。可以把一些需要执行的任务,做成服务,放在服务器或自己电脑服务上,就可以自动跑,设置开机自起。

十:不足的地方

  • 本文没有介绍 EventLog是怎么来:这个在工具箱中,可以找到,然后点击Service1,做进来就行了
  • 服务默认是启动和停止方法,还可以扩展,有暂停,恢复,这两个方法,需要我们重写才能触发事件
  • 园友提供:Topshelf有兴趣试试

原文地址:https://www.cnblogs.com/2828sea/p/13445738.html

posted @ 2020-08-06 15:13  喜欢吃鱼的青年  阅读(2102)  评论(14编辑  收藏  举报