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工具安装服务时候,如果路径中存在空格,安装会报错。

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/tyb1222/p/1819020.html
Copyright © 2011-2022 走看看