创建一个Windows Service应用程序
--------------------------------------------------------------------------------
下载本文代码
见资源
正是由于.NET Framework的出现,才使你能够构建出在系统重新启动时自动运行的、无人参与的(unattended)应用程序。
by Stan Schultes
技术工具箱:VB.NET, XML, ASP
Windows service应用程序曾经是C++程序员专用的领域,除非你在VB中使用了第三方工具。现在它们则成为System.ServiceProcess 命名空间下的.NET Framework类库中的主要部分,你可以随意使用任何.NET语言来构建它。Windows service是一种系统自动的、无人参与的程序(仅存在于Windows NT、2000和XP操作系统中),它能够在系统启动时开始运行。你可以通过Service Control Manager (SCM) applet或者一些特殊的service-control应用(utility)来访问Windows service。
我将讲解如何构建一个用于监控文件改变情况的Windows service。FileChangeMonitor service用于随意地编写事务日志(event-log)条目以及当文件在一段时间内没有改变时发送e-mail。这种文件监控过程在用于确保需要时进行备份、正常运转报告生成器或按时间表将文件传送到远程系统上时是非常有用的。FileChangeMonitor service还能够发送显示程序正常运行的综合报告。
第一步是构建一个作为将来service项目起始点的Windows service程序的模板。打开Visual Studio.NET,用Windows Service模板来创建一个新的项目,将其命名为FileChangeMonitor(点此下载范例代码)。鼠标右键单击Solution Explorer(SE)中的Service1.vb文件并将其重新命名为ChangeMonitor.vb。点击ChangeMonitor 设计界面(你会看到“To add components to your class”消息),并将其在属性窗口(按F4显示的窗口)中的的名字和ServiceName属性均改为ChangeMonitor。
同样将属性窗口中的CanPauseAndContinue和CanShutdown属性值设置为True。 这些属性控制着该service程序是否能够暂停/继续,以及在系统关闭时是否做出响应。你将在后面使用这些事件(以及Stop事件)来保存你的service的“状态”――即给定时间内的执行文本(execution context )。
接下来,点击ChangeMonitor 设计窗口中的“click here to switch to code view”链接。在代码窗口中,点击左边的加号来打开名为“Component Designer generated code”的区域。在Sub Main过程(routine)中,将ServicesToRun 赋值语句中的Service1改为ChangeMonitor: ServicesToRun = New System. _
ServiceProcess.ServiceBase() _
{New ChangeMonitor()}
右键单击在SE中的FileChangeMonitor项目,选中属性,再从StartupObject下拉列表中选择Sub Main。现在你就可以开始构建你的项目了(通过使用Build | Build Solution菜单项)。
创建事件模板和过程
现在,在模板中加入一些事件过程(event-routine)的原型。你等一会儿可以将代码添加到这些service事件中去以便处理 Windows service程序中的状态变化。在代码窗口中点击Class Name combo box(位于代码窗口上面左侧的combo box),然后选中(Overrides)选项。在Method Name combo box中(位于代码窗口上面右侧的combo box),依次选中各项以便将过程原型(一个空程序)添加到代码窗口中,比如:OnContinue、OnPause和OnShutdown。你必须在每个过程中的Method Name combo box中重新选择(Overrides)选项 。
接下来就开始构建过程模板。在你需要添加代码的ChangeMonitor.vb中创建五个子过程原型: LoadSettings()、SaveSettings()、RunCheck()、RunSummary()和StartService()。在这个类的最顶部Imports System.ServiceProcess语句的下面,通过使用Imports语句来添加其他需要用到的命名空间:Imports System.IO
Imports System.Timers
Imports System.Web.Mail
Imports System.Reflection
Imports System.Xml.Serialization
由于你的service应用程序不是一个Web项目,因此你可能需要手动将一个引用(reference)添加到Web.Mail命名空间下。右键单击SE中的FileChangeMonitor项目,从弹出菜单中选择Add Reference。在 Add Reference对话框中选择列表中的System.Web.dll条目,单击Select按钮,然后点OK。
在ChangeMonitor类的顶部、Component Designer区域的前面,添加一个用于文件检查功能的Timer对象的声明: Private WithEvents ControlTimer As Timer
然后将下面三行代码加到OnStart和OnContinue事件程序中: StartService()
RunCheck()
RunSummary()
当你的service启动时会触发OnStart事件,而当暂停后继续运行时则会触发OnContinue事件。
在Class Name combo box中选择ControlTimer,并在Method Name combo box中选择Elapsed。这样就会将ControlTimer_Elapsed事件过程原型添加到项目中了。只需添加这两个Run语句到ControlTimer_Elapsed事件过程中,然后在OnPause、OnShutdown和OnStop事件过程中添加代码来中断计时器(Timer)并保存设置: ControlTimer.Stop()
SaveSettings()
从这个简单的程序大纲中你可以看到用于Windows service应用程序的文件检查功能的控制流程是如何运作的。当其中一个事件触发时,StartService函数便会加载设置,然后运行文件和简要检查。你可以在计时器时间到时运行检查程序;可以用stop或pause事件来中断计时器以及保存设置。
在StartService过程中添加代码来创建计时器,将时间间隔定为15秒(以毫秒值计),然后启动它:ControlTimer = New Timer()
ControlTimer.Interval = 15000
ControlTimer.AutoReset = True
ControlTimer.Start()
AutoReset = True属性设定使计时器在时间到时继续运行。接下来,你可以在check函数运行时添加代码来编写Windows Application事务日志,这样你就可以看到service正在运行: Private Sub RunCheck()
EventLog.WriteEntry(ServiceName & _
" - Check", "Checking Files.")
End Sub
你可以通过Windows中的Event Viewer(EV)应用程序来查看事件日志中的消息。
添加一个安装程序(Installer)
创建s