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

posted @ 2010-09-06 13:40  tyb1222  阅读(5479)  评论(1编辑  收藏  举报