windows服務應用程序是一種長期運行在操作系統后台的程序,它對於服務器環境特別適合,它沒有用戶界面,不會產生任何可視輸出,任何用戶輸出都回被寫進windows事件日志。計算機啟動時,服務會自動開始運行,他們不要用戶一定登陸才運行。
可以通過選擇菜單“開始”-〉“控制面板”-〉“管理工具”-〉“服務”來查看現有系統中的服務,如下圖:
創建window 服務
新建一個window 服務項目MyService,如下圖
從工具箱的組件表中拖動一個Timer對象到這個視圖設計器上面。
設置Timer屬性,Enable為true,Interval屬性為3000毫秒
雙擊Timer事件,添加事件

1 public partial class Service1 : ServiceBase 2 { 3 public Service1() 4 { 5 InitializeComponent(); 6 } 7 8 protected override void OnStart(string[] args) 9 { 10 // TODO: 在此處添加代碼以啟動服務。 11 } 12 13 protected override void OnStop() 14 { 15 // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。 16 } 17 18 private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 19 { 20 21 } 22 }
1 public partial class Service1 : ServiceBase 2 { 3 public Service1() 4 { 5 InitializeComponent(); 6 } 7 protected override void OnStart(string[] args) 8 { 9 // TODO: 在此處添加代碼以啟動服務。 10 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啟動"; 11 WriteLog(state); 12 } 13 protected override void OnStop() 14 { 15 // TODO: 在此處添加代碼以執行停止服務所需的關閉操作。 16 string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止"; 17 WriteLog(state); 18 } 19 private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 20 { 21 WriteLog(DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); 22 } 23 public void WriteLog(string str) 24 { 25 using (StreamWriter sw = File.AppendText(@"c:\service.txt")) 26 { 27 sw.WriteLine(str); 28 sw.Flush(); 29 } 30 } 31 }
其中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方法:
方法 |
描述 |
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() |
等待服務到達指定的狀態 |