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