zoukankan      html  css  js  c++  java
  • .Net 平台下开发Windows服务

      Windows服务是C/S程序另一种表现形式。在.NET开发下的windows服务和系统其他服务表现形式一样。

      首先介绍开发Windows服务的两个重要的类window服务类(假称A类)和添加安装程序类(假称B类)。在B类中有两个组件serviceInstaller1、serviceProcessInstaller1。他们分别是System.ServiceProcess.ServiceInstaller、System.ServiceProcess.ServiceProcessInstaller的对象。那么他们两有什么区别吗?MSDN给出的解释如下:

      ServiceProcessInstaller:安装一个可执行文件,该文件包含扩展 ServiceBase 的类。该类由安装实用工具(如 InstallUtil.exe)在安装服务应用程序时调用。ServiceProcessInstaller 执行可执行文件中的所有服务的公共操作。安装实用工具使用它来写与要安装服务关联的注册表值。

    若要安装服务,请创建一个从 Installer 继承的项目安装程序类,然后将该类上的 RunInstallerAttribute 设置为 true。在项目中,为每个服务应用程序实例化一个 ServiceProcessInstaller 实例,并为应用程序中的每个服务实例化一个ServiceInstaller 实例。最后,向项目安装程序类添加 ServiceProcessInstaller 实例和 ServiceInstaller 实例。

    当 InstallUtil.exe 运行时,该实用工具在服务程序集内查找 RunInstallerAttribute 设置为 true 的类。通过将类添加到与项目安装程序关联的 Installers 集合来向服务程序集添加类。如果 RunInstallerAttribute 为 false,安装实用工具将忽略项目安装程序。

    对于 ServiceProcessInstaller 实例,可修改的属性包括指定服务应用程序在登录用户之外的帐户下运行。可指定运行该服务所使用的特定UserName 和Password 对,或者可使用Account 指定该服务是在计算机的系统帐户、本地或网络服务帐户还是用户帐户下运行。(注意:计算机的“系统”帐户与“管理员”帐户不同。)

      ServiceInstaller:安装一个类,该类扩展 ServiceBase 来实现服务。在安装服务应用程序时由安装实用工具调用该类。ServiceInstaller 执行特定于其所关联服务的操作。它由安装实用工具用来将与服务关联的注册表值写入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 注册表项内的子项。服务由它在该子键内的“服务名”(ServiceName) 标识。该子键还包含服务所属的可执行文件或 .dll 的名称。

      以上至列出简要介绍,更详尽的介绍请参见MSDN.

      下面简要介绍服务的是实现过程。

      一、.NET 2.0平台上不能直接建立windows服务项目。在.NET 2.0平台上开发windows服务,需要自己建立工程,然后添加安装程序(Installer.cs)和window服务(Service.cs)。然后在,安装程序文件和window服务文件中分别编写代码完成。

      环境介绍:.NET2.0 SP2.(我电脑上面不能直接创建,但是我同事电脑能直接创建Windows服务。没闹明白这两个SP2区别在哪。但是他的版本应该比我的高)

      过程如下:

      1.建立项目(我开发的时候直接建立的Winfrom项目),右击项目,在选择添加安装程序(Installer.cs)和window服务(Service.cs)分别添加到项目中。如下图:

      

      2.在Service.cs中using System.ServiceProcess命名空间。

          ServiceInstaller installer = new ServiceInstaller();
                //设置服务名称
                installer.ServiceName = "TestDemo";

       //设置服务的启动类型。下面设置的启动方式为自动启动
                installer.StartType = ServiceStartMode.Automatic;

       //设置服务的描述
                installer.Description = "测试服务";

       //申明服务安装对象(在使用安装服务工具时,它会被工具调用以完成服务安装)

                ServiceProcessInstaller processer = new ServiceProcessInstaller();

       //设置服务的账户。下面设置的为本地系统
                processer.Account = ServiceAccount.LocalSystem;

       //将安装服务实例与安装处理对象添加到安装程序的集合。
                Installers.Add(installer);
                Installers.Add(processer);

       3.在以下方法中编写服务启动以及服务停止时的代码

           protected override void OnStart(string[] args)
              {
               
              }

              protected override void OnStop()
              {
              }

          4.将program.cs中的入口函数(main函数)中,改为ServiceBase.Run(new Service1())

          5.生成.exe文件

      二、在.NET3.5平台上开发windows服务可以直接在建立项目上键一个window服务项目,里面直接就有了Service.cs文件,用户可以添加为他添加安装程序以完成windows服务的开发。

        环境介绍:.NET3.5SP2.

        1.右击Service1.cs查看设计器。然后在设计器重右击选择菜单中的添加安装程序,系统会为此服务添加安装程序的文件ProjectInstall .cs(默认名称,当然你也可以修改)。

        2.同样的方式查看ProjectInstall .cs中右击,选择查看设计器。在他的设计器重默认有两个文件:ServiceProcessInstaller1和ServiceInstaller1.cs。

        3.设置ServiceProcessInstaller1和ServiceInstaller1.cs的属性。将ServiceProcessInstaller1的Account设置为LocalSystem.当然你也可以设置为其他的。若你将  其设置为User则你需要在安装服务的时候设置服务登陆。我例子中 ServiceProcessInstaller1属性的设置如下图:

        

        ServiceInstaller1.cs的属性设置如下图:

         

        其中他的属性设置和2.0平台上的的上述例子的installer属性设置一样。只是一个通过属性设置、一个通过代码设置。

        3.编写服务实现的功能。如下为我做的服务测试的功能:每一秒向指定文本将当前时间写进去。

     System.Timers.Timer timer;
            public Service1()
            {
                InitializeComponent();
                this.ServiceName = "TestDemo";           
            }

            protected override void OnStart(string[] args)
            {
                timer = new System.Timers.Timer(1000);
                timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
                timer.AutoReset = true;
                try
                {
                    timer.Start();
                }
                catch(ArgumentOutOfRangeException Ex)
                {
                    throw Ex;
                }
            }

            protected override void OnStop()
            {
                timer.Stop();
                timer = null;
            }

            private void timer_Elapsed(object obj, EventArgs args)
            {
                using (FileStream fs = new FileStream(@"D:\test.txt", FileMode.Append, FileAccess.Write))
                {
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        sw.WriteLine(DateTime.Now.ToString());
                    }
                }

            }

      4.编译项目,生成安装文件

    三、服务的安装。

    不管在2.0平台还是3.5平台,对windows服务的安装都是 通过installutil工具完成的。使用方法如下:

    1.打开VS2008下的命令提示。

    2.输入installutil  D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe,即可完成服务的安装。安装成功后的命令界面太大这里就不截取了。安装成功的服务

    可以在计算机的服务中找到。如下如图:

    3》服务的卸载:输入installutil /u  D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe即可完成服务的卸载。若此时服务正在运行中,也可卸载(它会先尝试关闭服务,然后卸载)。如下图:

    做完这些后,就可以在D:\test.txt中看到每个一秒的时间记录。

    就写到这里了,希望对进行相关开发的朋友们有所帮助!

    注意:使用installutil工具安装服务时候,如果路径中存在空格,安装会报错。

  • 相关阅读:
    Angular2+学习第1篇 简介
    JS:ES5数组基本操作
    git常用操作命令
    URL-Routing
    uid-datepicker
    元素隐藏 css
    Angular2+学习第2篇 cli 环境搭建过程
    DRF 07
    DRF小练习 04
    DRF小练习 02
  • 原文地址:https://www.cnblogs.com/tyb1222/p/1819020.html
Copyright © 2011-2022 走看看