如何创建一个标准的Windows服务

在很多时候,我们需要一个定时器,当间隔某段时间或者在某一个时刻的时候,触发某个业务的处理,这个时候,我们就可能需要引入Windows服务来做这个事情,如某些数据的同步操作、某些工作任务的创建或者侦听某些端口的工作等等。
做过Windows Forms开发的人,对开发Windows服务可能会熟悉一些,其实它本身应该算是一个Windows Forms程序。基本上整个Windows服务的程序分为几个部分:安装操作实现、程序启动、服务操作等。
本例子创建一个Windows服务,服务可以在整点运行,也可以在某段间隔时间运行,通过配置指定相关的参数。
完整的服务代码请下载文件进行学习:http://files.cnblogs.com/wuhuacong/AutoSyncService.rar 

1)安装操作类的实现
首先需要继承System.Configuration.Install.Installer类,并且需要增加ServiceProcessInstaller、ServiceInstaller两个对象来处理,另外您需要重载BeforeUninstall 和 AfterInstall 来实现服务在安装前后的启动和停止操作。


    [RunInstaller(true)]
    
public class ListenInstaller : Installer
    {
        
private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller;
        
private System.ServiceProcess.ServiceInstaller serviceInstaller;

        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>
        private System.ComponentModel.IContainer components = null;   

        
public ListenInstaller()
        {
            InitializeComponent();
            
//重新覆盖设计时赋予的服务名称
            this.serviceInstaller.DisplayName = Constants.ServiceName;
            
this.serviceInstaller.ServiceName = Constants.ServiceName;
        }
       

        
public override void Install(System.Collections.IDictionary stateSaver)
        {
            
base.Install(stateSaver);
        }


        
private void serviceInstaller_AfterInstall(object sender, InstallEventArgs e)
        {
            ServiceController service 
= new ServiceController(Constants.ServiceName);

            
if (service.Status != ServiceControllerStatus.Running)
            {
                
try
                {
                    service.Start();
                }
                
catch (Exception ex)
                {
                    EventLog loger;
                    loger 
= new EventLog();
                    loger.Log 
= "Application";
                    loger.Source 
= Constants.ServiceName;
                    loger.WriteEntry(ex.Message 
+ "/n" + ex.StackTrace, EventLogEntryType.Error);
                }
            }
        }

        
private void serviceInstaller_BeforeUninstall(object sender, InstallEventArgs e)
        {
            ServiceController service 
= new ServiceController(Constants.ServiceName);

            
if (service.Status != ServiceControllerStatus.Stopped)
            {
                
try
                {
                    service.Stop();
                }
                
catch (Exception ex)
                {
                    EventLog loger;
                    loger 
= new EventLog();
                    loger.Log 
= "Application";
                    loger.Source 
= Constants.ServiceName;
                    loger.WriteEntry(ex.Message 
+ "/n" + ex.StackTrace, EventLogEntryType.Error);
                }
            }
        }
         ...............
 
    }



2)程序启动
程序的启动很简单,基本上是自动创建服务程序的时候就生成了,这里列出来解析是为了说明服务调试的操作。
程序的启动是在Main函数里面,添加下面的代码即可


            ServiceBase[] ServicesToRun;

            ServicesToRun 
= new ServiceBase[] { new SocketService() };

            ServiceBase.Run(ServicesToRun);


上面是标准的启动代码,但很多时候,我们需要调试服务,因此会加入一个跳转的开关


            #region 调试程序时使用的代码
            
//使用方法:在该Project的属性页,设置输入参数"-T",即可进入下面这段代码,发布时请去掉参数;
            if (args.Length >= 1 && args[0].ToUpper() == "-T")
            {
                
try
                {
                    SocketService service 
= new SocketService();
                    service.Execute();
                }
                
catch (Exception ex)
                {
                    
throw ex;
                }
                
return;
            }

            
#endregion

上面的操作就是为了可以使用普通的调试功能调试Windows服务,其中的"-T"是在开发工具VS的IDE上设置的一个参数, 如下图所示。
如何创建一个标准的Windows服务_第1张图片


3)服务操作
首先需要创建一个集成自System.ServiceProcess.ServiceBase的服务类,如SocketService服务类,在SocketService类的构造函数中,您可能需要初始化一些信息,如创建一个定时器,修改服务器类的名称,读取配置参数等信息,以便初始化服务类的参数。
接着您需要重载服务基类的一些函数:OnStart、OnStop、OnContinue、OnPause、OnShutdown和定时器的触发函数timerReAlarm_Elapsed。完整的类如下

Code


4. 使用InstallUtil来安装和卸载服务
安装和卸载Windows服务,需要使用InstallUtil工具类进行操作,该工具是Dotnet框架附带的一个工具,在%SystemRoot%/Microsoft.NET/Framework/*** 对应的目录中。
其中App.config中的内容如下


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    
<appSettings>
        
<!--心跳间隔,系统设置,单位(分钟)-->
        
<add key="TimerInterval" value="5" />
        
        
<!-- 运行同步服务的间隔时间(单位:分钟) -->
        
<add key="ServiceCycle" value="60" />
        
<!--Windows服务在固定时刻(0~23时刻)运行,设置了该参数,同步服务间隔参数无效,负数为禁用-->
        
<add key="ServiceRunAt" value="-1" />
        
        
<!--是否启动GBL信息自动同步服务-->
        
<add key="GBLService" value="True" />
        
<!--是否启动域用户信息自动同步服务-->
        
<add key="DomainService" value="True" />
        
    
</appSettings>
</configuration>


安装Windows服务的命令如下:

@ECHO OFF

REM The following directory is for .NET1.1
set DOTNETFX=%SystemRoot%/Microsoft.NET/Framework/v1.1.4322
set PATH=%PATH%;%DOTNETFX%

cd/
cd "%SystemRoot%/../Program Files/BornShine/用户信息同步服务"

echo 正在安装 用户信息同步服务
echo ---------------------------------------------------

InstallUtil 
/i AutoSyncService.exe

echo ---------------------------------------------------

echo Done.
exit


如何创建一个标准的Windows服务_第2张图片
卸载Windows服务的命令如下:


@ECHO OFF

REM The following directory is for .NET1.1
set DOTNETFX=%SystemRoot%/Microsoft.NET/Framework/v1.1.4322
set PATH=%PATH%;%DOTNETFX%

cd/
cd "%SystemRoot%/../Program Files/BornShine/用户信息同步服务"

echo 正在卸载 用户信息同步服务
echo ---------------------------------------------------

InstallUtil 
/U AutoSyncService.exe

echo ---------------------------------------------------

echo Done.
exit
主要研究技术:代码生成工具、Visio二次开发
    
    转载请注明出处:
撰写人:伍华聪  http: 
    
// www.iqidi.com

你可能感兴趣的:(如何创建一个标准的Windows服务)