windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志。计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行。
可以通过选择菜单“开始”-〉“控制面板”-〉“系统和安全”-〉”管理工具“ -〉“服务”来查看现有系统中的服务,如下图:
创建window 服务
新建一个window 服务项目MyService,如下图
从工具箱的组件表中拖动一个Timer对象到这个视图设计器上面。
设置Timer属性,Enable为true,Interval属性为3000毫秒
双击Timer事件,添加事件
后台代码 public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // TODO: 在此处添加代码以启动服务。 } protected override void OnStop() { // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { } }
public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // TODO: 在此处添加代码以启动服务。 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动"; WriteLog(state); } protected override void OnStop() { // TODO: 在此处添加代码以执行停止服务所需的关闭操作。 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止"; WriteLog(state); } private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { WriteLog(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); } public void WriteLog(string str) { using (StreamWriter sw = File.AppendText(@"c:\service.txt")) { sw.WriteLine(str); sw.Flush(); } } }
其中OnStart和OnStop分别是服务器启动和停止后,所发生的事件操作方法,WriteLog是操作方法;
将服务程序service1.cs 切换到视图模式,用鼠标右键单击设计视图选择“添加安装程序”选项,此后在项目中自动增加了一个ProjectInstaller.cs
设置serviceInstaller1组件属性,
ServiceName=MyServiceLog安装服务器名字;
StartType=Automatic 开机自动启动
设计serviceProcessInstaller1的属性Account=LocalSystem;
运行编译,一个简单的windows服务已经开发完成
注:如果在代码中的文件路径写成如下“service.txt”,那么此时文件保存在C:\WINDOWS\system32文件夹中。
安装window服务
安装命令:InstallUtil.exe MyServiceLog.exe
InstallUtil存在路径为:C:\WINDOWS\Microsoft.NET\Framework\.NET版本号
复制C:\WINDOWS\Microsoft.NET\Framework\版本号 路径中的InstallUtil.exe 到bin/debug或bin/release文件夹中,在命令行窗口中直接运行命令
InstallUtil.exe MyServiceLog.exe,在系统中注册这个服务,使它建立一个合适的注册项,如下图:
然后再window服务列表中,启动MyServiceLog服务
卸载window 服务
命令:InstallUtil.exe MyServiceLog.exe /u
如果修改这个服务,但是路径没有变化的话是不需要重新注册服务的,直接停止服务,然后用新的文件覆盖原来的文件即可,如果路径发生变化,应该先卸载这个服务,然后重新安装这个服务。
Window服务应用程序体系结构
.net framework对windows服务提供了更多的支持,在命名空间System.ServiceProcess下.
包括类如下:
ServiceBase 所有Window服务的基类
ServiceController 该类的一个实例代表一个具体的windows服务
ServiceControllerPermission 用于控制ServiceController的使用权限
ServiceInstaller 用于执行对windows服务的安装
ServiceProcessInstaller 用于执行对windows服务的安装,与上类的不同的是,该类可以代表一个可以执行的windows服务的进程.
ServiceBase类
当在服务应用程序中定义服务类时从 ServiceBase 派生。任何有用的服务均将重写 OnStart 和 OnStop 方法。对于其他功能,可以用特定行为重写 OnPause 和 OnContinue 来响应服务状态的更改。
服务是长时间运行的可执行文件,它不支持用户界面,在登录的用户帐户下可能无法运行。服务可以在没有任何用户登录计算机的情况下运行。
默认情况下,服务在“系统”帐户下运行,该帐户与“管理员”帐户不同。不能更改“系统”帐户的权限。或者,可以使用 ServiceProcessInstaller 指定运行服务时将使用的用户帐户。
一个可执行文件可以包含多项服务,但对每项服务均必须包含一个单独的 ServiceInstaller。ServiceInstaller 实例在系统中注册服务。安装程序还将每项服务与一个事件日志关联,您可以使用该日志记录服务命令。可执行文件中的 main() 函数定义哪些服务应该运行。服务的当前工作目录是系统目录,而不是可执行文件所位于的目录。
当启动某项服务时,系统将定位相应的可执行文件,并运行该服务的 OnStart 方法(它包含在可执行文件内)。但是,运行服务与运行可执行文件并不相同。可执行文件仅加载服务。服务则通过“服务控制管理器”访问(例如启动和停止)。
当您对服务首次调用“开始”时,可执行文件调用 ServiceBase 派生类的构造函数。在构造函数执行之后将立即调用 OnStart 命令处理方法。在服务首次加载之后,构造函数不会再次执行,因此有必要将构造函数执行的处理和 OnStart 执行的处理分开。可以由 OnStop 释放的任何资源都应在 OnStart 中创建。如果服务在 OnStop 释放资源后再次启动,那么,在构造函数中创建资源会妨碍这些资源的正确创建。
“服务控制管理器”(SCM) 提供与服务交互的方式。可以使用 SCM 将“开始”(Start)、“停止”(Stop)、“暂停”(Pause)、“继续”(Continue) 或自定义命令传递到服务中。SCM 使用 CanStop 和 CanPauseAndContinue 的值,决定服务是否接受“停止”、“暂停”或“继续”命令。仅当服务类中相应的属性 CanStop 或 CanPauseAndContinue 为 true 时,才会在 SCM 的上下文菜单中启用“停止”、“暂停”或“继续”。如果已启用,则相应的命令将传递到服务,并且调用 OnStop、OnPause 或 OnContinue。如果 CanStop、CanShutdown 或 CanPauseAndContinue 为 false,则即使已实现相应的命令处理方法(如 OnStop),也不会予以处理。
可以使用 ServiceController 类通过编程实现 SCM 使用用户界面实现的功能。可以自动处理控制台中可用的任务。如果 CanStop、CanShutdown 或 CanPauseAndContinue 为 true,但尚未实现相应的命令处理方法(如 OnStop),则系统引发异常并忽略该命令。
不必在 ServiceBase 中实现 OnStart、OnStop 或其他任何方法。然而,服务的行为在 OnStart 中加以描述,因此至少应重写该成员。必须在可执行文件的 main() 函数中设置服务的服务名称。在 main() 中设置的服务名称必须与服务安装程序的 ServiceName 属性完全匹配。
可以使用 InstallUtil.exe 在系统中安装服务。
可以参考文献:http://msdn.microsoft.com/zh-cn/library/system.serviceprocess.servicebase(VS.80).aspx