動態安裝你的windows服務
前言:先說明一下本文示例windows服務的簡單需求,即根據外部配置實現不同方式記錄日誌的功能。記錄日誌的方式有三種,分為文字記錄、資料庫記錄以及文字和資料庫同時記錄日誌。如您所知,這個功能基本上沒有任何實用價值,純粹為了方便本文的舉例和說明。文章最後提供示例demo下載。
一、中規中矩,寫一個簡單的windows服務
1、新建windows服務
開啟開發神器VS(我這裡用的是VS2010),單擊“新建專案”,在彈出的選項卡上左側選擇“Windows”,然後在右側選擇“Windows服務“模板,確定即可。按照命名需要,本文示例中我把VS預設生成的Service1重新命名為LogService。
(1)、建構函式
1 2 3 4 5 6 7 8 9 |
public LogService()
{
InitializeComponent();
this .ServiceName
= "SimpleLogService" ;
CanPauseAndContinue
= true ;
CanStop
= true ;
CanShutdown
= true ;
CanHandleSessionChangeEvent
= true ;
}
|
我們在建構函式裡設定了幾個常用的屬性。其中CanPauseAndContinue = true標識該windows服務可以暫停和繼續。其實我們也可以在設計介面進行屬性設定,不是重點,略過。
(2)、重寫事件
預設情況下,在LogService類中VS已經替我們生成了OnStart和OnStop方法。如果我們還設定了屬性 CanPauseAndContinue = true, 則我們可能還要重寫OnPause和OnContinue方法。在windows作業系統的服務控制器上,我們檢視任意一個服務的屬性,肯定會看到”啟動“、”停止“、”暫停“和”恢復“四個按鈕選項。上面的四個重寫方法我們可以理解成就是讓我們實現某個服務的四個按鈕選項下的對應事件。
SimpeLogervice
需要說明的是,windows服務都是在後臺默默無聞地低調工作著,所以對開發人員來講,通常長時間大批量的後臺工作任務,做成windows服務再合適不過。但是如果您的程式實現使用了非同步,就會給服務的停止、暫停和恢復等控制帶來極大難度,而且有時候甚至會產生意想不到的結果。本文示例中對於停止、暫停和恢復,都是對一個靜態執行緒進行操作。實際開發中這種方式並不保險,因為非同步程式中你實在不好控制程式到底執行到哪一步,執行的結果怎麼樣。我估計微軟預設不生成暫停和恢復這兩個事件,也是基於控制不易方面的考慮。在實際專案開發中,除非可以明確確定非同步程式已經暫時不工作(通過檢視特定日誌),否則“暫停”和“恢復”這兩個按鈕通常預設都是不可用的(CanPauseAndContinue = false)。
(3)、服務裡的主要業務邏輯簡單說明
在LogBuilder類裡,已經封裝了該windows服務主要的業務邏輯。其中三個方法Log2Text,Log2DB和LogBoth看命名知道是什麼意思了。本文重點也不在這裡,這裡一帶而過。
2、為服務新增Installer
服務的主體實現已經有了,當然還需要服務安裝程式邏輯。開啟LogService設計介面,右鍵選擇”Add Installer“欄目,在生成的ProjectInstaller裡就輕鬆添加了一個ServiceInstaller和ServiceProcessInstaller例項。這裡你可以根據VS提供的視覺化的方式給兩個Installer進行屬性設定,也可以直接在建構函式中設定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public ProjectInstaller()
{
InitializeComponent();
ServiceInstaller
installer = new ServiceInstaller();
installer.ServiceName
= "SimpleLogService" ; //服務的名稱要和LogService建構函式裡的服務名稱一致
installer.DisplayName
= "測試日誌記錄Windows服務" ; //windows服務顯示的名稱
installer.Description
= "這是一個簡單的測試日誌記錄Windows服務,在log資料夾下可以看到詳細文字日誌" ;
installer.StartType
= ServiceStartMode.Manual; //
自動 手動 或禁用 這裡設為手動
ServiceProcessInstaller
processInstaller = new ServiceProcessInstaller();
//
採用本地系統帳戶執行服務
|