zoukankan      html  css  js  c++  java
  • 如何做个自己想要的Window的服务了?

    前言说明

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

    一:什么是WindowService?(我们做的是一个什么东西?)

            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:ProgramDataMicrosoftWindowsStart MenuProgramsVisual Studio 2019Visual Studio Tools】,找到工具:Developer Command Prompt for VS 2019允许启动

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

    InstallUtil.exe C:**	estinDebug	est.exe
    


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

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

    输入命令:

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

    如上图表示启动成功

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

    输入命令:

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

    如上图表示关闭成功

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

    输入命令:

    InstallUtil.exe /u C:**	estinDebug	est.exe
    

    如上图表示卸载成功

    1.找到 C:ProgramDataMicrosoftWindowsStart MenuProgramsVisual Studio 2019Visual 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有兴趣试试
  • 相关阅读:
    USACO1.3.3Calf Flac
    USACO1.3.1Mixing Milk
    USACO1.3.2Barn Repair
    USACO2.1.4Healthy Holsteins
    USACO1.5.2Prime Palindromes
    USACO1.4.2The Clocks
    USACO2.1.2Ordered Fractions
    PHP关联数组教程
    你的服务器没有正确响应Token验证的解决方法
    微信公众平台消息接口开发(10)语音触发(非识别)
  • 原文地址:https://www.cnblogs.com/2828sea/p/13445738.html
Copyright © 2011-2022 走看看