.NET Windows编程系列(14):Windows服务

.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

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  博客园首页

  新闻频道

  社区

  小组

  博问

  网摘

  闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-17 11:13 编辑过
成果网帮您增加网站收入


相关链接: