.net/vs2005/c# 創建windows service/windows服務

先來說概念,所謂windows service,就是一個可以持續在後臺運行的沒有GUI界面的windows form程序.如果這樣理解,那接下來的編程就容易多了.
但是和winform不同的是,windows service有自己獨特的東西,那就是可以手動進行"開始","暫停"等操作.
一個可以使用windows service要包括windows service主程序和它的安裝程序.雖然我們說windows service是一個隱藏的winform,但它沒有辦法自己完成安裝,所以需要有額外的安裝程序輔助.
本文將分兩步介紹:程序的開發,程序的安裝.

1.windows service的開發

使用vs新建一個project,在windwos類別中選擇windows service,選好路徑,創建.這將自動爲你創建一個繼承自ServiceBase的類.通過在類名上右鍵選"view code"進入到這個類的代碼頁.
而實際上,如果你創建了一個類庫的project,然後創建一個新類,並讓這個類繼承System.ServiceProcess.ServiceBase,那也算是創建了一個windows service.所以,實際上,用c#寫一個windows service,實際上就是要寫一個繼承自ServiceBase的類.
接下來,你要編碼實現你想要的操作.比如跟蹤系統中某個文件的變化.
我們還是要拿winform來說明,一般一個程序寫完後,點擊exe文件,它就會運行,那麼要怎麼樣讓windows service運行?稍微對計算機系統熟悉的人都知道,要去控制面板的"服務"窗口對服務進行管理.比如要讓你的服務開始運行,就點擊"開始服務".很明顯這是一個事件.ServiceBase類提供了對這類事件的支持,他們分別是
OnStart/OnStop/OnPause/OnContinue
可以直接從字面意思來理解這些事件.
要讓你寫的跟蹤程序開始運行,就在下面的事件中寫些代碼
protected override void OnStart(string[] args)
        {
            // TODO: Add code here to start your service.
        }
一般來說,爲了滿足"開始停止"這樣的操作,我們的windows service類中會有一個標誌符來控制程序流.比如當start的時候,isRun=true,但是如果用戶選擇停止這個服務,那isRun=false.
還必須的一個東西,是給ServiceName賦值,這是ServiceBase的一個屬性,用來指定服務的名稱.
如此這般,完成你的winfows service類.


按照文章一開始說的,windows service沒有辦法雙擊就運行.它需要一個安裝類來輔助.接下來我們要做的,就是給這個服務添加一個安裝輔助類.
在project名上右鍵,添加新項目,選擇installer class.vs會自動給我們創建一個安裝類.
實際上,你也可以添加一個新類,然後讓這個類繼承自System.Configuration.Install.Installer.所以,實際上,用c#寫一個安裝類,實際上就是要寫一個繼承自Installer的類.
說到這裏打斷一下,雖然你可以自己創建windows service類和install類,但是還是建議讓vs來給你創建,因爲這樣除了有清晰的層次關係,還會得到很多自動生成的代碼段.比如說重寫的Dispose方法.
安裝windows service類,首先需要一個service安裝進程,然後在進程中有service的安裝,所以,我們需要在這個安裝類中創建這兩個類.
this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
你可以這樣想:ServiceInstaller負責安裝windows service,而ServiceProcessInstaller是包裹在外面的一層.
this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
this.serviceProcessInstaller1.Password = null;
this.serviceProcessInstaller1.Username = null;
這個來設置安裝時的權限,一般選擇本地系統賬戶的,話,就不需要用戶名和密碼了
this.serviceInstaller1.ServiceName = "notus";
this.serviceInstaller1.Description = "a sample";

serviceInstaller1.StartType = ServiceStartMode.Automatic;
而ServiceInstaller設定的都是和服務本身相關的一些參數,比如啓動方式,名字,描述等.
這裏的ServiceName要和前面你寫的windows service的名字相同.否則會出麻煩.
如果你想在安裝的前後做點什麼,那就需要進入到事件的操作.ServiceInstaller提供了安裝時的一些事件供你使用,比如下面這個:
serviceInstaller1.BeforeUninstall += new System.Configuration.Install.InstallEventHandler(serviceInstaller1_BeforeUninstall);
我們可以給這個事件加個代碼,就是確保你在刪除服務的時候,該服務是停止的.(如果服務正在運行,而你要刪除它,那就會出問題)
 void serviceInstaller1_BeforeUninstall(object sender, System.Configuration.Install.InstallEventArgs e)
        {
            ServiceController con = new ServiceController(serviceInstaller1.ServiceName);
            if (con.Status == ServiceControllerStatus.Running || con.Status == ServiceControllerStatus.StartPending)
            {
                    con.Stop();
            }
        }
還有一點要注意的是,如果要使用那些環境變量,需要按照下面的方法取得:
this.serviceProcessInstaller1.Context.Parameters["SURL"];
這個安裝類麻煩了些,因爲出現了三個帶install的類,最後應該類似於這個樣子:
 [RunInstaller(true)]

 public partial class ProjectInstaller : Installer

{
 this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
 this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
 //......
}
如此這般,完成你的安裝類.

這樣,工作就基本完成了.如果你是用vs自動添加的這兩個類,可能會有些小迷惑,因爲點擊view code,和到裏面在點擊,會有很多個名字一樣的類出現,然後有的繼承了基類,有的沒有繼承,有的又引用什麼的...其實安靜下來看,這幾個類都是partial的,也就是局部類.不要被vs弄暈.


2.widnows service的安裝

vs命令提示符

一種是在vs命令提示符下(注意不是cmd敲出來的那個,而是在開始菜單的vs安裝目錄下那個)用命令操作
使用這個安裝 installutil myservice1.exe
這樣刪除 installutil /u myservice1.exe
當然,在運行前,你得先定位到myservice1.exe所在的文件夾.

windows安裝項目

也可以使用vs提供的製作安裝程序的功能,把你的project添加到主輸出,就可以安裝.
新建peject,在其他那一類中選擇setup project,vs會給你創建一個安裝項目.
在項目名上右鍵,add,peojet output(輸出),把你的服務project添加進來.然後再在項目名上右鍵,view,custom action,你會看到有四個類別,分別是install,commit,rollback,uninstall,在上面右鍵,add custom action,然後在application folder中找到你的服務project,添加進來.
如此這般(...),完成.
編譯,運行,看看效果 :)如果不出意外,你的服務就可以在控制面板的"服務"窗口中找到.

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章