.NET Windows编程系列(14):Windows服务
摘要:
Windows服务是独立于登录用户而工作的Windows应用程序,通常用来执行与具体用户无关的操作系统级别的任务,例如进程监视、数据备份等。本节介绍如何通过.NET来创建Windows服务。
注:本系列节选自MSDN Webcasts上邵志东老师的《 .NET Windows编程系列课程》PPT内容,在我的Blog中整理发表,方便大家一同参考!此系列相关资料请到这里下载。
本节主要内容:
Windows服务概述
创建、配置和运行Windows服务
Windows服务应用程序体系结构
可交互Windows服务的实现
一、Windows服务概述
Windows服务是独立于登录用户而工作的Windows应用程序,它通常在计算机启动时开始执行,且常常连续执行,直到计算机关闭为止。
Windows服务通常用来执行与具体用户无关的操作系统级别的任务,例如进程监视、数据备份等
管理工具-“Windows服务管理器”(控制面板-管理工具-服务)
Windows服务分类
- Adapter:硬件设备服务,运行此类服务需要相关的设备驱动程序
- FileSystemDriver:文件系统驱动服务,属于内核设备驱动的一种
- InteractiveProcess:可以和桌面进行交互的Windows服务
- KernelDriver:内核设备驱动服务,例如磁盘驱动器
- RecognizerDriver:也是一种文件系统驱动服务,用于在系统启动过程中决定文件系统的类型(FAT32、NTFS等)
- Win32OwnProcess:只能运行在自身进程当中的Win32服务
- Win32ShareProcess:可以与其他Win32服务共享进程的Win32服务
二、创建、配置和运行Windows服务
案例介绍
每次启动计算机后,将当前计算机上运行的所有设备驱动服务记录到一个文本文件中。该服务随着系统启动而自动启动,启动的同时在C盘上打开文本文件SvrLog.txt(不存在时创建),而后通过Windows服务控制器获得当前所有设备驱动服务的列表,将这些服务的名称、类型及绑定名写入文本文件。服务还记录了每次服务启动和关闭的时间,由于该服务于Windows系统同步运行,那么实际上记载的是系统的启动和关闭时间。这样通过该文件我们可以一览本地系统不同时间内所有设备启动服务的信息。
设备服务监控程序的建立
1.创建项目
新建项目,选择模板为“Windows服务”,名称为SrvMon;然后在解决方案资源管理器中,修改“Service1.cs”为SrvMon.cs。
2.添加组件
先从工具箱的“Windows Form”中选择一个DateTimePicker组件添加到设计视图,接着从工具箱的“组件”中选择“ServiceController”组件添加到设计视图,并修改“serviceController1”的“ServiceName”属性为“SrvMon”,再从工具箱的“组件”中选择“EventLog”组件添加到设计视图,并修改“eventLog1”的“Log”属性为“MyNewLog”,“Source”属性为“MySource”。然后右键点击设计视图,选择“添加安装程序”,选择“serviceInstaller1”组件,修改“ServiceName”属性为“SrvMon”;选择“serviceProcessInstaller1”组件,修改“Account”属性为“LocalSystem”,最后单击设计视图的空白处,在属性窗口将“Name”属性设置为“SrvMon”,将“AutoLog”属性设置为False,将“ServiceName”属性设置为“SrvMon”,将“CanPauseAndContinue”设置为true。
3.添加代码
先在初始部分添加:using System.IO;然后在OnStart()、OnStop()中添加相应代码,最后编译代码。
DEMO1:Windows服务的创建
4.安装Windows服务
把生成的“SrvMon.exe”复制到c:\盘,然后启动“Visual Studio.net命令提示”工具,在命令窗口中运行:installutil c:\srvmon.exe
5.启动服务
打开Windows服务管理器,右键点击“SrvMon”服务,选择“运行”,在C:\生成一个SrvLog.txt,查看其内容。
6.服务自动启动
先停止原来的SrvMon服务,然后在开发环境中,打开ProjectInstaller.cs设计视图,选中“serviceInstaller1”,将StartType属性修改为“Automatic”最后重新安装服务,这样SrvMon就成为和系统一起启动的服务了。
三、Windows服务应用程序体系结构
FrameWork对Windows服务的支持;名称空间:System.ServiceProcess
包括的类
- ServiceBase:所有Windows服务的基类
- ServiceController:该类的一个实例代表着一个具体的Windows服务
- ServiceControllerPermission:用与控制ServiceController的使用权限
- ServiceInstaller:用于执行对Windows服务的安装
- ServiceProcessInstaller:用于执行对Windows服务的安装。与以上类不同的是,该类代表一个可以执行的Windows服务进程。Windows服务进程可以通过Windows任务管理器进行控制。
- TimeOutException:提供对Windows服务超时服务时异常处理的机制
ServiceBase类
ServiceBase类是所有Windows服务的基类。我们编写Windows服务时都要从这个类派生自己的类
1.ServiceBase的方法
| 方法 |
描述 |
|
Run()
|
运行一个Windows服务
|
|
OnContinue()
|
继续执行服务
|
|
OnCustomCommand()
|
向Windows服务发出自定义指令
|
|
OnPause()
|
暂停正在运行的Windows服务
|
|
OnPowerEvent()
|
当计算机的电源状态改变时调用
|
|
OnShutDown()
|
当系统关闭时调用OnStart()开始一个Windows服务
|
|
OnStop()
|
结束一个Windows服务
|
2.ServiceBase的属性
|
属性
|
描述
|
|
AutoLog
|
表示是否将开始、结束、暂停、继续等指令写入事件日志
|
|
CanHandlePowerEvent
|
表示该服务是否支持电源事件功能
|
|
CanPauseAndContinue
|
表示该服务是否支持暂停和继续功能
|
|
CanShutdown
|
表示该服务是否支持关闭功能
|
|
CanStop
|
表示该服务是否支持结束功能
|
|
EventLog
|
应用程序的时间日志
|
|
ServiceName
|
该服务的名称
|
ServiceController类
服务控制器,用于控制Windows服务的各种具体行为。它既可以控制本地的Windows服务,又可以控制远程的Windows服务。
1.ServiceController的方法
| 方法 |
描述 |
|
GetDivices()
|
得到一台计算机上的设备驱动器服务
|
|
GetServices()
|
得到一台计算机上的非设备驱动器服务
|
|
Close()
|
用于断开服务连接,并且释放服务控制器所占用的全部资源
|
|
Continue()
|
继续被暂停的服务
|
|
ExcuteCommand()
|
对服务执行一条自定义指令
|
|
Pause()
|
暂停服务
|
|
Refresh()
|
将所有属性更新
|
|
Start()
|
启动服务
|
|
Stop()
|
停止服务
|
|
WaitForStatus()
|
等待服务达到指定的状态
|
2.ServiceController的属性
| 属性 |
描述 |
|
CanPauseAndContinue
|
表示服务是否可以被停止
|
|
CanShutDown
|
表示服务在系统关闭时是否可以得到通知CanStop表示服务是否可以被停止
|
|
DependentServices
|
表示与服务相关联的设备
|
|
DisplayName
|
表示服务控制器所绑定的名称
|
|
MachineName
|
表示该服务所在的计算机名称
|
|
ServiceName
|
表示所绑定的服务的名称
|
|
ServiceType
|
表示控制器所引用的服务的类型
|
|
ServicesDependedOn
|
表示服务所依赖的服务集合Status表示控制器所引用的服务的状态
|
ServiceInstaller类
用于安装从ServiceBase继承的Windows服务
1.ServiceInstaller的属性
| 属性 |
描述 |
|
DisplayName
|
显示名称
|
|
ServiceName
|
标识服务名称,这个名称必须与Installer将要安装的Windows服务名称相同
|
|
ServiceDependOn
|
服务所要用到的其服务名称的一个数组
|
|
StartType
|
表示所安装的服务的启动特性。可以为Automatic,Manual,Disable。默认为Manual。
|
2.ServiceInstaller的事件
| 方法 |
事件 |
|
AfterInstaller()
|
调用Install方法后发生
|
|
AfterRollback()
|
调用Rollback方法后发生
|
|
AfterUninstall()
|
调用UnInstall方法后发生
|
|
BeforeInstall()
|
调用Install方法前发生
|
|
BeforeRollback()
|
调用Rollback方法前发生
|
|
BeforeUninstall()
|
用UnInstall方法前发生
|
|
Committed()
|
调用Commit方法后发生
|
|
Committing()
|
调用Commit方法前发生
|
ServiceProcessInstaller类
用于安装从ServiceBase继承的Windows服务。它与一个可执行程序中的所有服务所作的工作基本相同
1.ServiceProcessInstaller的属性
| 属性 |
描述 |
|
Account
|
运行服务的当前用户帐号
|
|
HelpText
|
在服务安装选项中给出的帮助信息
|
|
Password
|
运行服务的当前用户帐号的密码
|
|
Username
|
运行服务的当前用户帐号的用户名
|
2.ServiceProcessInstaller的事件(类似ServiceInstaller)
DEMO2:文件监视Windows服务的创建
四、可交互Windows服务的实现
Windows 服务应用程序在不同于登录用户的交互区域的窗口区域中运行。窗口区域是包含剪贴板、一组全局原子和一组桌面对象的安全对象。由于Windows 服务的区域不是交互区域,因此Windows 服务应用程序中引发的对话框将是不可见的,并且可能导致程序停止响应。同样,错误信息应记录在Windows 事件日志中,而不是在用户界面中引发。
.NET Framework 支持的Windows 服务类不支持与交互区域(即登录用户)进行交互。同时,.NET Framework 不包含表示区域和桌面的类。如果Windows 服务必须与其他区域进行交互,则需要访问非托管的Windows API。
也就是说我们要实现可交互的服务(比如我们想给服务在运行时做一些参数设置等),那我们一定要using System.Runtime.InteropServices。
DEMO3:可交互Windows服务的实现
本系列文章快速导航:
posted @ 2007-11-12 19:47
李永京 阅读(1107)
评论(0) 编辑 收藏 所属分类:
WinForm