C# Windows 服务

Windows 服务是操作系统启动时可以自动打开的应用程序。Windows服务可以在没有交互式用户登录系统的情况下运行。可以把Windows 服务配置为从已进行特殊配置的用户账户或系统用户账户上运行。下面以VS2008为例,来看.net Windows 服务的简单使用。

      一、创建Windows 服务

      新建一个项目,Visual C# —> Windows –> Windows 服务,将项目名称改为WinServiceTest,修改项目的相应位置,如图1所示,

C# Windows 服务图1

      单击确定后便会出现一个外表与Windows Forms 应用程序相似的设计器,但是不能在其中插入Windows Forms 组件,因为Windws 服务程序不能直接在屏幕上显示任何信息,见图2,

C# Windows 服务

图2

      打开服务的属性编辑窗口,可以配置服务的相关属性,见图3,

C# Windows 服务图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. 添加安装与部署项目

C# Windows 服务 

图4

      2. 向安装项目添加WinServiceTest.exe

      在解决方案资源管理器中,右击“MyServiceSetup”,指向“添加”,然后选择“项目输出”,出现“添加项目输出组”对话框。在“项目”框中选择“WinServiceTest”,在列表框中,选择“主输出”,然后单击“确定”,WinServiceTest的主输出的项目项被添加到安装项目中,见图5。

C# Windows 服务

图5

      3. 向安装项目添加自定义操作

      在解决方案资源管理器中右击安装项目,指向“视图”,然后选择“自定义操作”,出现自定义操作编辑器。

C# Windows 服务

图6

      在“自定义操作”编辑器中右击“自定义操作”节点,然后选择“添加自定义操作”,出现“选择项目中的项”对话框。

C# Windows 服务 图7

 

     在列表框中双击“应用程序文件夹”将其打开,选择“主输出来自WinServiceTest(活动)”,然后单击“确定”。  

C# Windows 服务  图8

      主输出被添加到自定义操作的所有四个节点,即“安装”、“提交”、“回滚”和“卸载”。

C# Windows 服务

图9

      4. 生成安装项目

     在解决方案资源管理器中,右击WinServiceTest项目并选择“生成”。若要安装服务,右击解决方案资源管理器中的安装项目,并选择“安装”,按界面提示完成安装。

C# Windows 服务

上一篇:DelphiXE7 新建工程布局的设置于添加!


下一篇:C#中的Dictionary类,默认key是区分大小写的