windows服務應用程序是一種長期運行在操作系統后台的程序,它對於服務器環境特別適合,它沒有用戶界面,不會產生任何可視輸出,任何用戶輸出都回被寫進windows事件日志。
計算機啟動時,服務會自動開始運行,他們不要用戶一定登陸才運行。
可以通過選擇菜單“開始”-〉“控制面板”-〉“管理工具”-〉“服務”來查看現有系統中的服務,如下圖:
創建一個windows服務
切換到代碼視圖修改.
using System; using System.IO; using System.ServiceProcess; namespace WindowsServiceTest { public partial class hjpServiceTest : ServiceBase { //定時器 System.Timers.Timer t = null; public hjpServiceTest() { InitializeComponent(); //啟用暫停恢復 base.CanPauseAndContinue = true; //每5秒執行一次 t = new System.Timers.Timer(5000); //設置是執行一次(false)還是一直執行(true); t.AutoReset = true; //是否執行System.Timers.Timer.Elapsed事件; t.Enabled = true; //到達時間的時候執行事件(theout方法); t.Elapsed += new System.Timers.ElapsedEventHandler(theout); } //啟動服務執行 protected override void OnStart(string[] args) { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啟動"; WriteLog(state); } //停止服務執行 protected override void OnStop() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止"; WriteLog(state); } //恢復服務執行 protected override void OnContinue() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "繼續"; WriteLog(state); t.Start(); } //暫停服務執行 protected override void OnPause() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暫停"; WriteLog(state); t.Stop(); } public void WriteLog(string str) { using (StreamWriter sw = File.AppendText(@"d:\service.txt")) { sw.WriteLine(str); sw.Flush(); } } public void theout(object source, System.Timers.ElapsedEventArgs e) { WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); } } }
解釋:OnStart和OnStop分別是服務器啟動和停止后,所發生的事件操作方法.定義了一個定時器,每隔5秒執行一次(theout方法),因為暫停恢復功能默認是不啟用的,需要設置CanPauseAndContinue屬性啟用此功能,同時重寫OnStop和OnContinue方法,添加自己的邏輯代碼.
將服務程序hjpServiceTest.cs 切換到視圖模式,用鼠標右鍵單擊設計視圖選擇“添加安裝程序”選項,此后在項目中自動增加了一個ProjectInstaller.cs,
如下圖
打開ProjectInstaller,修改serviceInstaller1組件屬性
Description= 我的服務備注 服務備注說明
DisplayName=我的服務 服務友好名字
ServiceName=hjpServiceTest 安裝服務器名字
StartType=Automatic 服務類型
ü Manual 服務安裝后,必須手動啟動。
ü Automatic 每次計算機重新啟動時,服務都會自動啟動。
ü Disabled 服務無法啟動。
並設計serviceProcessInstaller1的屬性Account=LocalSystem
運行編譯,一個簡單的windows服務已經開發完成.
安裝window服務
安裝命令:InstallUtil.exe WindowsServiceTest.exe
InstallUtil存在路徑為:C:\WINDOWS\Microsoft.NET\Framework\.NET版本號
復制C:\WINDOWS\Microsoft.Net\Framework\版本號 路徑中的InstallUtil.exe 到bin/debug或bin/release文件夾中,在命令行窗口中直接運行命令
InstallUtil.exe WindowsServiceTest.exe,在系統中注冊這個服務,使它建立一個合適的注冊項,如下圖:
然后再window服務列表中,啟動hjpServiceTest服務
卸載window 服務
命令:InstallUtil.exe WindowsServiceTest.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 |
方法 | 事件 |
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方法里設置一個斷點,然后等它執行,服務執行到該處時候會自動啟動斷點。