用C# 编写 Windows 服务

本文详细介绍了Windows服务的基础知识,包括其种类、概念及启动流程,并提供了使用C#进行Windows服务开发的具体指导,涵盖Service Base类的使用、ServiceController类的操作方法以及如何安装Windows服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

                   

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值