C# 发布windows 服务

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志。计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行。

可以通过选择菜单“开始”-〉“控制面板”-〉“管理工具”-〉“服务”来查看现有系统中的服务,如下图:

 

 

 

创建window 服务

新建一个window 服务项目MyService,如下图

 

 

切换到代码视图修改.

[csharp] view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Diagnostics;  
  6. using System.IO;  
  7. using System.Linq;  
  8. using System.ServiceProcess;  
  9. using System.Text;  
  10. using System.Threading.Tasks;  
  11.   
  12. namespace MyService  
  13. {  
  14.     public partial class Service1 : ServiceBase  
  15.     {  
  16.         //定时器  
  17.         System.Timers.Timer t = null;  
  18.   
  19.   
  20.         public Service1()  
  21.         {  
  22.             InitializeComponent();  
  23.   
  24.             //启用暂停恢复  
  25.             base.CanPauseAndContinue = true;  
  26.   
  27.             //每5秒执行一次  
  28.             t = new System.Timers.Timer(5000);  
  29.             //设置是执行一次(false)还是一直执行(true);  
  30.             t.AutoReset = true;  
  31.             //是否执行System.Timers.Timer.Elapsed事件;  
  32.             t.Enabled = true;  
  33.             //到达时间的时候执行事件(theout方法);  
  34.             t.Elapsed += new System.Timers.ElapsedEventHandler(theout);  
  35.               
  36.         }  
  37.   
  38.         //启动服务执行  
  39.         protected override void OnStart(string[] args)  
  40.         {  
  41.             string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动";  
  42.             WriteLog(state);  
  43.   
  44.         }  
  45.   
  46.         //停止服务执行  
  47.         protected override void OnStop()  
  48.         {  
  49.             string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";  
  50.             WriteLog(state);  
  51.         }  
  52.   
  53.         //恢复服务执行  
  54.         protected override void OnContinue()  
  55.         {  
  56.             string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "继续";  
  57.             WriteLog(state);  
  58.             t.Start();  
  59.         }  
  60.   
  61.         //暂停服务执行  
  62.         protected override void OnPause()  
  63.         {  
  64.             string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暂停";  
  65.             WriteLog(state);  
  66.   
  67.             t.Stop();  
  68.         }  
  69.   
  70.   
  71.         public void WriteLog(string str)  
  72.         {  
  73.             using (StreamWriter sw = File.AppendText(@"d:\service.txt"))  
  74.             {  
  75.                 sw.WriteLine(str);  
  76.                 sw.Flush();  
  77.             }  
  78.         }  
  79.   
  80.         public void theout(object source, System.Timers.ElapsedEventArgs e)  
  81.         {  
  82.   
  83.             WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));  
  84.         }  
  85.     }  
  86. }  

 
解释:OnStart和OnStop分别是服务器启动和停止后,所发生的事件操作方法.定义了一个定时器,每隔5秒执行一次(theout方法),因为暂停恢复功能默认是不启用的,需要设置CanPauseAndContinue属性启用此功能,同时重写OnStop和OnContinue方法,添加自己的逻辑代码.

 

 

将服务程序service1.cs 切换到视图模式,用鼠标右键单击设计视图选择“添加安装程序”选项,此后在项目中自动增加了一个ProjectInstaller.cs,

如下图

打开ProjectInstaller,修改serviceInstaller1组件属性

 

Description= 我的服务备注                       服务备注说明

DisplayName=我的服务                            服务友好名字 

ServiceName=MyService                         安装服务器名字

StartType=Automatic                                服务类型

ü         Manual      服务安装后,必须手动启动。

ü         Automatic    每次计算机重新启动时,服务都会自动启动。

ü         Disabled     服务无法启动。

 

 

并设计serviceProcessInstaller1的属性Account=LocalSystem

 

运行编译,一个简单的windows服务已经开发完成.

 

 

安装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方法:

方法

描述

Run()

运行一个windows服务

OnContinue()

继续执行服务

OnCustomCommand()

向windows服务发出自定指令

OnPause()

暂停正在运行的windows服务

OnPowerEvent()

当计算机的电源状态改变是调用

OnShutDown()

当系统关闭条用OnStart()开始一个windows服务

OnStop()

结束一个windows服务

 ServiceBase属性:

属性

描述

AutoLog

表示是否将开始,结束,暂停,继续等指令写入事件日志

CanHandlePowerEvent

表示该服务是否支持电源事件

CanPauseAndContinue

表示该服务是否支持暂停和继续功能

CanShutDown

表示该服务是否支持关闭功能

CanStop

表示该服务是否支持结构功能

EventLog

应用程序的时间日志

ServiceName

该服务名称

 

 

 

 

 

 

 

 

 

 

 

 

 

 ServiceController类

服务控制类,用于控制windows服务的各种具体行为,它既可以控制本地的windows服务,有可以控制远程的windows服务。

ServiceControler的方法:

方法

描述

GetDivices()

得到一台计算机上设备驱动器服务

GetServices()

得到一台计算上的非设备驱动器服务

Close()

用于断开服务连接,并且释放服务控制器所占用的资源

Continue()

继续被暂停的服务

ExcuteCommand()

对服务执行一条自定义命令

Pause()

暂停服务

Refresh()

对所有属性更新

Start()

启动服务

Stop()

停止服务

WaitForStatus()

等待服务到达指定的状态

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ServiceController属性

属性描述
CanPauseAndContinue表示服务是否可以停止
CanShutDown表示服务在系统关闭时是否可以得到通知,CanStop表示服务器是否可以被停止
DependentServices表示与服务相关联的设备
DisplayName表示服务控制器所绑定的名称
MachineName表示服务所在的计算机名称
ServiceName表示绑定的服务名称
ServiceType表示控制器所引用的服务类型
ServicesDependedOn表示服务所依赖ude服务集合Status表示控制器所引用的服务状态

 

 

 

 

 

 

 

 

 

 

 


ServiceInstaller类

ServiceInstaller的属性

属性描述
DisplayName显示名称
ServiceName表示服务名称,这个名称必须与Installer将要安装的windows服务名称相同
ServiceDependOn服务所要用到的其服务名称的一个数组
StartType表示所安装服务的启动特性,可以为Automatic,Manual或Disable,默认为Manual

 

 

 

 

 
 
 
ServiceInstaller事件
方法事件
AfterInstaller()调用Install方法后发生
AfterRollback()调用Rollback后发生
AfterUninstall()调用Uninstall方法后发生
BeforeInstall()调用Install方法前发生
BeforeRollback()调用Rollback方法前发生
BeforeUninstall()调用Uninstall方法前发生
Committed()调用Commit方法后发生
Committing()调用Commit方法前发生
 
 
 
 
 
 
 

 

 

 

 

 

 

ServiceProcessInstaller类

用于安装ServiceBase继承的windows服务,它与一个可执行程序中的所有服务所做基本工作相同

ServiceProcessInstaller属性

属性描述
Account运行服务的当前用户账号
HelpText在服务安装选项中给出的帮助信息
Password运行服务的当前账号密码
UserName运行服务的当前账号用户名

 

 

 

 

 

 

 

------------------------------------------------------------------------------------------------------------------------

Windows服务调试

 

管理员方式运行vs 打开MySerivceLog项目

在管理工具-〉服务里面启动MyServiceLog服务

单击vs的调试 -〉附加到进程,如下图

在附加到:选择里面勾选  自动确定要调试的代码类型

 

在"可用进程“列表中,选中你要调式的服务的可执行文件名

单击 ”附加“按钮,即可进入调试状态

在timer1_Elapsed方法里设置一个断点,然后等它执行,服务执行到该处时候会自动启动断点

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值