用C# 编写 Windows 服务

1. Windows 服务的基本知识 

           Windows 服务是运行在后台的程序。他没有用户界面,不能与用户交互。Windows 服务通常被用来收集和分析系统数据,或记录日志。

       1.1 Windows 服务的种类

               1.1.1  Win32OwnProcess  一个进程中只包含一个服务 

               1.1.2  Win32ShareProcess  一个进程中包含了几个服务

       1.2 Windows 服务的几个基本概念  

              1.2.1 Service Control Manager        所有服务的管理者,他管理所有的服务,他向服务发送请求来启动,暂停,停止一个服务

              1.2.2 Service Dispatcher    一个管理Windows 服务的Shell ,可通过【控制面板】->【管理工具】->【服务】 打开 , 他负责向 Service Control Manager 发送请求

       1.3 Windows 服务的启动流程

               当Service Control Manager 收到一个服务启动请求时,他会查找此服务所在的可执行文件(.exe) , 然后执行可执行文件的Main 函数,此时Service Control Manager 等待此进程调用  StartServiceCtrlDispatcher 函数,如果一段时间后进程没有调用此函数,Service Control Manage 便会认为此服务启动失败。StartServiceCtrlDispatcher需要一个SERVICE_TABLE_ENTRY 结构作为参数,此结构包含了此进程中包含的所有的服务的名字。 当StartServiceCtrlDipatcher 调用成功后,他就将主进程与Service Control  Manager 连接起来,直到此进程中所有的服务全都退出后,此函数才会返回。此时Service Control Manager 就可以通过此连接向服务发送请求了。此时StartServiceCtrlDispatcher 扮演了一个消息调度器的角色。Service Control  Manager 向调度器发送服务启动请求,调度器创建一个新的线程来执行被请求服务的ServiceMain 函数。

               在ServiceMain 中,函数必须使用RegisterServiceCtrlHandleEx 函数来注册自己的消息处理函数,并使用SetServiceStatus 报告自己的状态。

              关于StartServcieCtrlDispatcher 的说明:通常情况下,调用此函数的主线程处于休眠状态,只有两种情况能激活他:  1. Service Control Service 向此进程的某个服务发送了消息, 此时,主线程激活,使用服务注册的消息处理函数,向服务转发消息 ,完毕之后再次进入休眠状态                                  2. 此进程中某一个服务停止了, 此时,主线程激活,将活动服务数量减一,当数量为0 ,则StartServiceCtrlDispatcher返回,否则,再次进入休眠状态。

2.用C#编写 Windows 服务

         在.Net Framework 中,编写Windows 服务变成了一件很容易的事。

         2.1  Service Base  类

                 最主要的一个类,代表一个Windows 服务。

                 2.1.1 主要属性 (Property)

                        1.ServiceName    服务的名字,SCM(Service Control Manager)使用这个名字来标识此服务

                 2.1.2 主要的方法 (method)

                        1.Run      此方法是静态的。 此方法实质是调用StartServiceCtrlManager 函数。他接受一个ServiceBase类型的数组作为参数(即为此进程中包含的所有的服务)。

                        2. OnStart , OnStop .......    你可重写这些方法,来响应服务的启动,停止,暂停等事件。

         2.2 ServiceController 类

                通过这个类你能向SCM (Service Control Manager ) 发送消息来控制Windows服务。

                2.2.1 主要属性(Property)

                         1.MachineName   服务所在的计算机名(默认为本机)

                         2.ServiceName   所要的控制的Windows 服务的名字

                2.2.2  主要方法 (Method)

                         1. GetServices  此方法是静态的。 得到所有服务的列表

                         2. Start , Stop,Pause,Resume,ExecuteCommand  开始,停止,暂停,恢复,执行命令此服务

           2.3 安装Windows 服务

                由于Windows 服务需要向系统写入一些注册信息,所以需要编写安装类来安装Windows 服务。

                  2.3.1 ServiceInstaller  类

                       安装一个服务,需要为安装的每个服务创建一个ServiceInstaller

                       2.3.1.1 主要属性

                           1.ServiceName   安装服务的名字

                           2.StartType  服务启动的类型,如手动,自动

                  2.3.2 ServiceProcessInstaller 类

                         安装一个服务进程

                        2.3.2.1 主要属性

                             1.Account  服务使用的账户类型

                  2.3.3  如果服务中使用了日志,性能计数器,消息队列,还必须创建相应的EventlogInstaller,PerformanceCounterInstaller,MessageQueueInstaller 类的实例。

                  2.3.4  通过Visual Studio ,你可以方便的创建安装类,方法是在设计视图中,选中一个服务或组件,右击,在菜单中选择【创建安装程序】

                  2.3.5 当编译完成之后,可使用installutil工具安装服务

                           1. 安装

                               Installutil  filename

                            2. 卸载

                               Installutil  /u filename

                   

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值