Windows 服务的使用
Windows 服务是操作系统启动时可以自动打开的应用程序。Windows服务可以在没有交互式用户登录系统的情况下运行。可以把Windows 服务配置为从已进行特殊配置的用户账户或系统用户账户上运行。下面以VS2008为例,来看.net Windows 服务的简单使用。
一、创建Windows 服务
新建一个项目,Visual C# —> Windows –> Windows 服务,将项目名称改为WinServiceTest,修改项目的相应位置,如图1所示,
单击确定后便会出现一个外表与Windows Forms 应用程序相似的设计器,但是不能在其中插入Windows Forms 组件,因为Windws 服务程序不能直接在屏幕上显示任何信息,见图2,
图2
打开服务的属性编辑窗口,可以配置服务的相关属性,见图3,
使用服务属性可以设置以下值:
- AutoLog指定启动服务和停止服务的事件自动写到日志文件中。
- CanPauseAndContinue、CanShutdown和CanStop指定服务可以处理具体的暂停、继续、关闭和停止服务的请求。
- ServiceName是写到注册表中的服务名称,使用这个名称可以控制服务。
- CanHandlePowerEvent选项对运行在膝上计算机的服务有效。如果启用这个选项,服务就可以响应低电源事件,以改变服务的操作方式。
对任何属性的修改,都反应在.Designer.cs文件中InitializeComponent方法中,与Windows Forms 相似。应用程序的主函数在创建项目时生成的Program.cs文件中,在主函数中,声明了一个元素为ServiceBase类的数组ServicesToRun,如果这个服务进程中要运行多个服务,就需要把具体服务类的多个实例添加到数组中,然后把ServicesToRun数组传递给ServiceBase类的静态方法Run();如果进程中只有一个服务,就可以删除数组,Run()方法接收从ServiceBase派生出来的单个对象。
服务启动时会调用OnStart()方法,可以在OnStart()方法中添加处理程序,如设置时钟、启动线程等。服务停止时会调用OnStop()方法,可以在OnStop()方法中添加处理程序,如关闭时钟、停止线程等。如果设置了服务的相关属性,同样可以重写服务类中的OnPause()、OnContinue()、OnShutdown()、OnCustomCommand()方法,其中OnCustomCommand()处理程序可以为服务控制程序发送过来的定制命令提供服务。
二、Windows服务安装
要安装服务必须为服务添加安装程序类。切换到Visual Studio的设计视图,右键点击空白处,选择“添加安装程序,组件设计器将会创建一个新的ProjectInstall类、一个ServiceInstall实例和一个ServiceProcessInstaller实例。ServiceProcessInstaller类用于配置进程,为这个进程中所有服务定义属性值(记住,一个服务进程可以包含多个服务),这些共享的属性见下表:
属性 |
描述 |
UserName,Password | Accout属性设置为ServiceAccout.User,则UserName属性和Password属性指出服务是在哪一个账户下运行 |
Account | 使用这个属性,可以指定服务的账户类型 |
HelpText | HelpText属性是只读属性,它返回的文体用于帮助设置用户名和密码 |
表1
ServiceProcessInstaller类的Account属性值可以是ServiceAcount枚举的任一值,见表2
值 |
意义 |
LocalSystem | 设置这个值可以指定服务在本地系统上使用高度权限的用户账户,但这个账户允许匿名用户进入网络,因此它没有网络上的权限 |
LocalService | 这个账户类型给任意远程服务器提供计算机证书 |
NetworkService | 类似于LocalService,这个值指定把计算机的证书传送给远程服务器,但与LocalSystem不同,这种服务可以以非授权用户的身份 登录本地系统。顾名思义,这个账户只能用于需要从网络上获得资源的服务 |
User | 把Account属性设置为ServiceAccount.User,表示可以指定应在服务中使用的账户 |
表2
ServiceInstaller 每一个服务都需要的类,这个类的属性可以用于进程中的第一个服务,其属性有StartType、DisplayName、ServiceName和ServicesDependedOn,如表3中所示。
属性 |
说明 |
StartType | StartType指出服务是手动启动还是自动启动。它的值可以是:SeriveStartMode.Automatic、ServiceStartMode.Manual、 ServiceStartMode.Disabled。如果使用ServiecStartMode.Disabled,服务就不能启动。这个选项可用于不应在系统中启动的服 务。例如,如果没有得到需要的硬件控制器,就可以把该选项设置为Disable。 |
DisplayName | DisplayName是显示给用户的服务的友好名称。此外,这个名称也用于控制和监视服务的管理工具。 |
ServiceName | ServiceName为服务的名称。这个值必须与服务程序中ServiceBase类的ServiceName属性一致,这个名称与把ServiceInstaller 配置为需要的服务程序相关。 |
ServiceDespendedOn | 指定必须在服务启动之前启动的一个服务组。当服务启动时,所有相依存的的服务都自动启动,并且我们的服务也将启动。 |
把安装类添加到项目后,可以使用installutil.exe 实用程序安装和卸载服务,这个应用程序可以用于安装包含了Install类的所有程序集。安装与卸载服务的命令分别如下:
installutil WinServiceTest.exe
installutil /u WinServiceTest.exe
也可以使用Windows 自带的服务安装命令,如
sc start WinServiceTest.exe
sc delete WinServiceTest.exe
三、windows 服务安装包制作
虽然可以使用installutil和sc命令来安装服务,但为了更直观和方便,可以将服务打包成安装包,然后通过界面提示进行安装。其步骤如下:
1. 添加安装与部署项目
图4
2. 向安装项目添加WinServiceTest.exe
在解决方案资源管理器中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”,出现“添加项目输出组”对话框。在“项目”框中选择“WinServiceTest”,在列表框中,选择“主输出”,然后单击“确定”,WinServiceTest的主输出的项目项被添加到安装项目中,见图5。
图5
3. 向安装项目添加自定义操作
在解决方案资源管理器中右击安装项目,指向“视图”,然后选择“自定义操作”,出现自定义操作编辑器。
图6
在“自定义操作”编辑器中右击“自定义操作”节点,然后选择“添加自定义操作”,出现“选择项目中的项”对话框。
在列表框中双击“应用程序文件夹”将其打开,选择“主输出来自WinServiceTest(活动)”,然后单击“确定”。
主输出被添加到自定义操作的所有四个节点,即“安装”、“提交”、“回滚”和“卸载”。
图9
4. 生成安装项目
在解决方案资源管理器中,右击WinServiceTest项目并选择“生成”。若要安装服务,右击解决方案资源管理器中的安装项目,并选择“安装”,按界面提示完成安装。