程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C#創建Windows服務

C#創建Windows服務

編輯:.NET實例教程

Windows服務在Visual Studio 以前的版本中叫NT服務,在VS.Net啟用了新的名稱。用Visual C# 創建Windows服務不是一件困難的事,本文就將指導你一步一步創建一個Windows服務並使用它。這個服務在啟動和停止時,向一個文本文件中寫入一些文字信息。

 第一步:創建服務框架 
要創建一個新的 Windows 服務,可以從Visual C# 工程中選取 Windows 服務(Windows Service)選項,給工程一個新文件名,然後點擊 確定。

你可以看到,向導向工程文件中增加WebService1.cs類:

其中各屬性的含意是:

ü         Autolog                 是否自動寫入系統的日志文件

ü         CanHandlePowerEvent     服務時候接受電源事件

ü         CanPauseAndContinue          服務是否接受暫停或繼續運行的請求

ü         CanShutdown 服務是否在運行它的計算機關閉時收到通知,以便能夠調用 OnShutDown 過程

ü         CanStop                              服務是否接受停止運行的請求

ü         ServiceName                       服務名

 

第二步:向服務中增加功能 
在 .cs代碼文件中我們可以看到,有兩個被忽略的函數 OnStart和OnStop。

OnStart函數在啟動服務時執行,OnStop函數在停止服務時執行。在這裡,當啟動和停止服務時,向一個文本文件中寫入一些文字信息,代碼如下:

protected override void OnStart(string[] args)

{

 FileStream fs = new FileStream(@"d:\mcWindowsService.txt" , FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter m_streamWriter = new StreamWriter(fs);

m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

m_streamWriter.WriteLine("mcWindowsService:         Service Started"+DateTime.Now.ToString()+"\n");

m_streamWriter.Flush();

m_streamWriter.Close();

fs.Close();

 

}

 

protected override void OnStop()

{

FileStream fs = new FileStream(@"d:\mcWindowsService.txt" , FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter m_streamWriter = new StreamWriter(fs);

$False$

m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

m_streamWriter.WriteLine(" mcWindowsService: Service Stopped "+DateTime.Now.ToString()+"\n");

m_streamWriter.Flush();

m_streamWriter.Close();

fs.Close();

}

 第三步: 將安裝程序添加到服務應用程序

 Visual Studio.Net 隨附有安裝組件,可用來安裝與服務應用程序相關聯的資源。安裝組件在正在安裝到的系統上注冊一項單個的服務,並使服務控制管理器知道該服務的存在。

要正確安裝服務,並不需要在安裝程序中進行任何特殊編碼。但是,如果需要向安裝進程添加特殊功能,則可能偶爾需要修改安裝程序的內容。

       將安裝程序添加到服務應用程序的步驟是:

1:在解決方案中,訪問要向其中添加安裝組件的服務的Design視圖。

2:在屬性窗口中,單擊添加安裝程序鏈接

這時項目中就添加了一個新類 ProjectInstaller 和兩個安裝組件 ServiceProcessInstaller 和 ServiceInstaller,並且服務的屬性值被復制到組件。

3:若要確定如何啟動服務,請單擊 ServiceInstaller 組件並將 StartType 屬性設置為適當的值。

ü         Manual      服務安裝後,必須手動啟動。

ü         Automatic    每次計算機重新啟動時,服務都會自動啟動。

ü         Disabled     服務無法啟動。

4:將serviceProcessInstaller類的Account屬性改為 LocalSystem

     這樣,不論是以哪個用戶登錄的系統,服務總會啟動。

 

第四步:生成服務程序

通過從生成菜單中選擇生成來生成項目。

注意   不要通過按 F5 鍵來運行項目——不能以這種方式運行服務項目。

第五步:安裝服務

訪問項目中的已編譯可執行文件所在的目錄。 
用項目的輸出作為參數,從命令行運行 InstallUtil.exe。在命令行中輸入下列代碼: 
installutil yourproject.exe
卸載服務

用項目的輸出作為參數,從命令行運行 InstallUtil.exe。

installutil /u yourproject.exe 

 

-----方法2

使用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)
        {
 &n

bsp;          // 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,而ServiceProcessIn
staller是包裹在外面的一層.
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 == ServiceControllerSt

atus.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,添加進來.
如此這般(...),完成.
編譯,運行,看看效果 :)如果不出意外,你的服務就可以在控制面板的"服務"窗口中找到.


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved