基于.NET的Windows服务开发

2022-09-12

Microsoft Windows服务 (即, 以前的NT服务) 使您能够创建在它们自己的Windows会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动, 可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用, 任何时候, 为了不影响在同一台计算机上工作的其他用户, 需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全下运行服务。

在.NET环境下开发Windows服务并不是一件特别复杂的工作, 但在开发过程中有许多细节需要注意, 下文将通过开发一个简单的Windows服务来说明在开发Windows服务过程中应该注意的问题。

1 创建Windows服务项目

在VS2010中创建一个新项目, 选择Windows服务模板, 并将项目名称命名为My Service。在打开的解决方案资源管理器中, 我们可以看到Windows服务项目的文件结构和Windows窗体应用程序项目类似, 只是其中的Form1.cs文件被替换为了一个名为Service1.cs的文件。打开program.cs文件, 我们会看到如下代码:

Service Base类是所有用.NET Framework开发的Windows服务的基类。所有的Windows服务类均必须从该类中派生。在上述代码中, 调用该类的静态方法RUN用于在服务控制管理器 (SCM) 中注册服务器的可执行文件。SCM是操作系统的一个组成部分, 它的作用是与服务进行通信, 并对服务进行管理。下图阐明了这种通信处理序列图的方式。

如果将服务设置为自动启动, 则在系统启动时, 将启动该服务的进程, 进而调用该进程的主函数。服务负责为它的每一个服务都注册一个service-main函数。主函数是服务程序的入口点, 在这里, service-main函数的入口点必须用SCM注册。

2 编写服务代码

创建好Windows服务项目后, 我们需要在项目中添加自己的服务逻辑。双击默认的Service1.cs文件, 我们将看到一个类似于Windows项目的设计界面。注意, 切记不要向其中拖放可视化空间, 由于Windows服务不支持可视化界面, 如果拖入可视化控件, 可能造成服务崩溃。选择这个服务的属性, 可以打开Properties editor窗口。在其中可以配置如下值:

Auto Log指定把启动和停止服务的事件自动写到事件日志中;

Can Pause And Contiue、Can Shutdown和Can Stop指定服务可以处理暂停、继续、关闭和停止服务的请求;

Service Name是写到注册表中的服务的名称, 使用这个名称可以控制服务;

Can Handle Session Change Event确定服务是否能处理终端服务会话中的改变事件;

Can Handle Power Event选项对运行在笔记本电脑或移动设备上的服务有效。如果启用这个选项, 服务就可以响应低电源事件, 并相应地改变服务的行为。

在设计界面中单击右键, 并选择查看代码选项, 我们将看到如下代码:

On Start方法和On Stop方法是从Service Base类继承下来的方法, 我们必须对他们进行重写, 来实现我们自己的服务的业务逻辑。调用On Start方法将启动服务, 该方法的线程不能停滞下来, 必须尽快返回给调用者。这是因为SCM对服务管理得限制, 如果服务的初始化花费的时间过多, 则SCM就假定服务启动失败。为了解决这个问题, 我们通常会利用线程来处理服务的实际工作。On Stop方法与On Start方法类似, 该方法会再服务停止时被调用。

修改Service1.cs中的代码, 添加服务的业务逻辑:

在初始化方法中将业务逻辑绑定到线程上, 并在On Start方法中添加启动线程的方法。该示例完成了一检测QQ进程, 并关闭QQ进程的Windows服务。

3 服务的安装

在Service1的设计界面中, 单击右键, 并选择添加安装程序子菜单, 该操作会向项目文件中添加一个名为Project Installer.cs的文件, 该文件中主要包含了Service Installer和Service Process Installer两个组件。这两个组件均派生于Component Installer类。其中Service Process Installer用于配制进程, 为这个进程中的所有服务定义值, 而Service Installer用于服务的配制, 因此, 每个服务都需要Service Installer类的一个实例。如果进程中有3个服务, 则必须添加额外的Service Installer对象。

在属性窗口中将Service Installer组件的Start Type属性设置为Automatic, 该属性的作用是设置服务的启动方式, 在这里将其设置为自动启动。将Service Process Installer的Account属性设置为Local System。Acount属性的作用是用于配制安装服务时, 使用的权限, 在这里我们使用了本地系统上的用户账户。

配制完安装相关的属性后, 在生成菜单中选择生成解决方案子项, 这时将在项目的目录中生成服务的EXE文件, 注意, Windows服务与普通应用程序不一样, 在操作系统中安装注册以前无法直接进行调试运行, 所有不要直接使用F5运行。

4 编写批处理文件, 安装运行Windows服务

在项目中添加2个文件如下 (必须是ANSI或者UTF-8无BOM格式) :

1) 安装脚本Install.bat

2) 卸载脚本Uninstall.bat

这两个脚本文件使用了installutil.exe使用程序来安装和卸载服务, 这个使用程序可以用于安装包含Installer类的所有程序集。Installuntil.exe使用程序调用派生自Install类的Installer () 方法进行安装, 调用Un Installer () 方法进行卸载。该程序在安装Framework时安装到系统目录下。

5 结语

本文研究了在.NET环境下使用C#语言开发Windows服务的一般方法, 并使用一个简单的案例阐述了Windows服务的开发步骤。在阐述过程中介绍了.NET中实现Windows服务的相关类的使用方法, 以及在开发Windows服务时应注意的的一些细节。通过阅读本文让读者能够轻松的开发自己的Windows服务项目。

摘要:windows服务指的是操作系统启动时可以自动打开的应用程序。Windows服务可以在没有交互式用户登录系统的情况下运行, 在后台进行某些处理, 本文作者结合自己经验介绍了如何用C#创建、安装、启动、监控、卸载简单的Windows Service的内容步骤和注意事项。供广大读者讨论学习和相互提高。

关键词:windows服务,.NET,c#,开发应用

参考文献

[1] 内格尔, 埃夫琴等著.C#高级编程[M].北京:清华大学出版社, 2010.11.

[2] Mc Connell.代码大全.电子工业出版社[M], 2006.3.

[3] Andrew Troelsen.C#与.NET 4高级程序设计[M].朱晔译.人民邮电出版社, 2011.4.

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:GE320密炼机料斗小车的技术改造下一篇:“勤求古训,博采创新”治疗颈椎综合征