標籤:覆蓋 空間 lease 介面 src frame ini 磁碟機 oca
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 |
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方法裡設定一個斷點,然後等它執行,服務執行到該處時候會自動啟動斷點。
建立第一個windows服務