一.Windows服务介绍:
Windows服务指的是操作系统启动时可以自动打开的应用程序。windows服务可以再没有交互式用户登录系统的情况下运行,在后台进行某些处理。
在以前,编写Windows服务程序需要程序员很强的C或C++功底。然而现在在Visual Studio.Net下,你可以运用C++或Visual C#或Visual Basic.Net很轻松的创建一个Windows服务程序。同样,你还可以运用其他任何与CLR相容的语言来创建Windows服务程序。本文就向大家介绍如何运用Visual C#来一步一步创建一个文件监视的Windows服务程序,然后介绍如何安装、测试和调试该Windows服务程序。
在介绍如何创建Windows服务程序以前,我先向大家介绍一些有关Windows服务的背景知识。一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序。Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就能开始运行了,它必须有特定的启动方式。这些启动方式包括了自动启动和手动启动两种。对于自动启动的Windows服务程序,它们在Windows启动或是重启之后用户登录之前就开始执行了。只要你将相应的Windows服务程序注册到服务控制管理器(Service Control Manager)中,并将其启动类别设为自动启动就行了。而对于手动启动的Windows服务程序,你可以通过命令行工具的NET START 命令来启动它,或是通过控制面板中管理工具下的服务一项来启动相应的Windows服务程序(见图1)。同样,一个Windows服务程序也不能像一般的应用程序那样被终止。因为Windows服务程序一般是没有用户界面的,所以你也要通过命令行工具或是下面图中的工具来停止它,或是在系统关闭时使得Windows服务程序自动停止。因为Windows服务程序没有用户界面,所以基于用户界面的API函数对其是没有多大的意义。为了能使一个Windows服务程序能够正常并有效的在系统环境下工作,程序员必须实现一系列的方法来完成其服务功能。Windows服务程序的应用范围很广,典型的Windows服务程序包含了硬件控制、应用程序监视、系统级应用、诊断、报告、Web和文件系统服务等功能。
在window7中打开window服务(右击“计算机”—>“管理”—>"计算机管理"—>"服务和应用程序"),如下图所示:
windows服务的体系结构
操作Windows服务需要3中程序:
1、服务程序
2、服务控制程序
3、服务配置程序
服务程序本身用于提供需要的功能。服务控制程序可以把控制请求发送给服务,例如开始、停止、暂停和继续。使用服务配置程序可以安装服务,这意味着服务不但要复制到文件系统中,还要写到注册表中,并配置为一个服务。.NET组件不需要把信息写入注册表,所以可以使用xcopy命令安装它们;但是,服务的安装需要注册表配置。此外,服务配置程序可以再以后改变服务的配置。
二.创建Windows服务程序:
在介绍如何创建Windows服务程序以前,我先向大家介绍一下.Net框架下与Windows服务相关的命名空间和其中的类库。.Net框架大大地简化了Windows服务程序的创建和控制过程,这要归功于其命名空间中的功能强大的类库。和Windows服务程序相关的命名空间涉及到以下两个:System.ServiceProcess和System.Diagnostics。
要创建一个最基本的Windows服务程序,我们只需要运用.Net框架下的System.ServiceProcess命名空间以及其中的四个类:ServiceBase、ServiceInstaller、ServiceProcessInstaller以及ServiceController,其体系结构可见图2。
其中ServiceBase类定义了一些可被其子类重载的函数,通过这些重载的函数,服务控制管理器就可以控制该Windows服务程序了。这些函数包括:OnStart()、OnStop()、OnPause()以及OnContinue()等四个。而且ServiceBase类的子类还可以重载OnCustomCommand()函数来完成一些特定的操作。通过重载以上的一些函数,我们就完成了一个Windows服务程序的基本框架,这些函数的重载方法如下:
protected override void OnStart(string[] args) { } protected override void OnStop() { } protected override void OnPause() { } protected override void OnContinue() { }
ServiceBase类还为我们提供了一些属性,而这些属性是任何Widnows服务程序所必须的。其中的ServiceName属性指定了Windows服务的名称,通过该名称系统就可以调用Windows服务了,同时其它应用程序也可以通过该名称来调用它的服务。而CanPauseAndContinue和CanStop属性顾名思义就是允许暂停并恢复和允许停止的意思。
要使得一个Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。在Windows服务程序中,我们也是在Main()函数中完成这个操作的。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而Run()方法并不就开始了Windows服务程序,我们必须通过前面提到的服务控制管理器调用特定的控制功能来完成Windows服务程序的启动,也就是要等到该对象的OnStart()方法被调用时服务才真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBae类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象,使得其中的每个对象对应于某个我们已预先定义好的服务。
static void Main() { System.ServiceProcess.ServiceBase[] MyServices; MyServices = new System.ServiceProcess.ServiceBase[] { new Service1(), new Service2() }; System.ServiceProcess.ServiceBase.Run(MyServices); }
三、Windows服务应用(利用计时器实时写入Window日志):
1、新建windows服务项目,如图:
2、在创建的项目上添加一个计数器(记住是System.Timer类下面的),详细说明见http://www.cnblogs.com/wxukie/archive/2008/01/17/1043219.html
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using System.IO; namespace MyService { partial class MyService : ServiceBase { public MyService() { InitializeComponent(); } protected override void OnStart(string[] args) { this.timer1.Enabled=true; EventLog.WriteEntry("time1", "window调用开始"); } protected override void OnStop() { this.timer1.Enabled = false; EventLog.WriteEntry("time1", "window调用结束"); } protected override void OnPause() { this.timer1.Enabled = false; EventLog.WriteEntry("time1", "window调用暂停"); } protected override void OnContinue() { this.timer1.Enabled = false; EventLog.WriteEntry("time1", "window调用恢复"); } protected override void OnShutdown() { this.timer1.Enabled = false; EventLog.WriteEntry("time1", "window关闭时调用"); } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { EventLog.WriteEntry("time1", "window正在调用中"); } } }
其中的OnStart方法是Windows服务开始时所调用的方法
OnEnd方法是Windows服务结束时调用的方法,
其它的方法(通过VS.NET的自动提示功能看的更多)自己看吧。
四、生成项目:
通过从生成菜单中选择生成来生成项目。(注意 不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。)
五、安装服务:
1. 访问项目中的已编译可执行文件所在的目录。
2. 用项目的输出作为参数,从命令行运行 InstallUtil.exe(这个执行程序在C:"WINDOWS"Microsoft.NET"Framework"v2.0.50727)。
3. 在命令行中输入下列代码:
InstallUtil.exe E:"MyService"MyService"bin"Debug"MyService.exe
Ps:路径根据可执行程序位置来定
4、卸载服务
用项目的输出作为参数,从命令行运行InstallUtil.exe
InstallUtil.exe E:"MyService"MyService"bin"Debug"MyService.exe -u
至此,整个服务已经编写,编译,安装完成,你可以在控制面板的管理工具的服务中,看到你编写的服务。
通过从生成菜单中选择生成来生成项目。(注意 不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。)
转自:http://www.oksvn.com/Article/Detail-53.shtml