zoukankan      html  css  js  c++  java
  • C# 编写Windows Service(windows服务程序)

    •  Windows Service简介:

    一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序。

    同样,一个Windows服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。

    和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess System.Diagnostics

    • 用C#创建Windows服务的步骤:

    1.创建Windows Service项目

    从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击 确定。

    2.向服务中函数功能实现

     OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。在这里,当启动和停止服务时,向一个文本文件中写入一些文字信息,代码如下:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyService
    {
        public partial class Service1 : ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
                FileStream fs = new FileStream(@"d:xx.txt", FileMode.OpenOrCreate, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.BaseStream.Seek(0, SeekOrigin.End);
                sw.WriteLine("WindowsService: Service Started" + DateTime.Now.ToString() + "
    ");
    
                sw.Flush();
                sw.Close();
                fs.Close();
            }
    
            //protected override void OnContinue()
            //{
            //    base.OnContinue();
            //}
    
            //protected override void OnPause()
            //{
            //    base.OnPause(); // father class method inherit
            //}
    
            //protected override void OnShutdown()
            //{
            //    base.OnShutdown();
            //}
    
            protected override void OnStop()
            {
                FileStream fs = new FileStream(@"d:xx.txt", FileMode.OpenOrCreate, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.BaseStream.Seek(0, SeekOrigin.End);
                sw.WriteLine("WindowsService: Service Stopped" + DateTime.Now.ToString() + "
    ");
                sw.Flush();
                sw.Close();
                fs.Close();
    
            }
        }
    }
    复制代码

    4.回到设计窗口点右键选择-添加安装程序 -生成serviceInstaller1和 serviceProcessInstaller1两个组件 
    把serviceInstaller1的属性ServiceName改写为你的服务程序名,并把启动模 式设置为AUTOMATIC  
    把serviceProcessInstaller1的属性account改写为 LocalSystem  


    5.编译链接生成服务程序

    通过从生成菜单中选择生成来生成项目。

    6.安装服务

    用.net framework工具INSTALLUTIL安装服务程序即可。

    用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码: 
    installutil yourproject.exe

    Hint: a windows service must first be installed using installutil.exe and then started with the serviceExplorer, windows Services Administrative tool or the NET START command.

    7.卸载服务

    用项目的输出作为参数,从命令行运行 InstallUtil.exe。

    installutil /u yourproject.exe

    如上服务程序运行结果截图:

    • 补充:

    1.Service启动属性:

            Manual      服务安装后,必须手动启动。

            Automatic    每次计算机重新启动时,服务都会自动启动。

            Disabled     服务无法启动。

    2.新建的Service项目,其中各属性的含义(设计视图->右键属性):

      Autolog 是否自动写入系统的日志文件

      CanHandlePowerEvent 服务时候接受电源事件

      CanPauseAndContinue 服务是否接受暂停或继续运行的请求

      CanShutdown 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程

      CanStop 服务是否接受停止运行的请求

      ServiceName 服务名

    3. 也可以在系统服务管理器中,设置相应Service的属性或启动方式等

    计算机管理 -> 服务和应用程序  -> 服务  -> ...

  • 相关阅读:
    BZOJ 3744 Gty的妹子序列
    BZOJ 3872 Ant colony
    BZOJ 1087 互不侵犯
    BZOJ 1070 修车
    BZOJ 2654 tree
    BZOJ 3243 向量内积
    1003 NOIP 模拟赛Day2 城市建设
    CF865D Buy Low Sell High
    CF444A DZY Loves Physics
    Luogu 4310 绝世好题
  • 原文地址:https://www.cnblogs.com/XuFen/p/6549614.html
Copyright © 2011-2022 走看看