標籤:style blog http io color os ar 使用 sp
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
Visual Studio 2012的Windows Service服務安裝方式