Windows服務是C/S程式另一種表現形式。在.NET開發下的windows服務和系統其他服務表現形式一樣。
首先介紹開發Windows服務的兩個重要的類window服務類(假稱A類)和添加安裝程式類(假稱B類)。在B類中有兩個組件serviceInstaller1、serviceProcessInstaller1。他們分別是System.ServiceProcess.ServiceInstaller、System.ServiceProcess.ServiceProcessInstaller的對象。那麼他們兩有什麼區別嗎?MSDN給出的解釋如下:
ServiceProcessInstaller:安裝一個可執行檔,該檔案包含擴充 ServiceBase 的類。該類由安裝工具 + 生產力(如 InstallUtil.exe)在安裝服務應用程式時調用。ServiceProcessInstaller 執行可執行檔中的所有服務的公用操作。安裝工具 + 生產力使用它來寫與要安裝服務關聯的註冊表值。
若要安裝服務,請建立一個從 Installer 繼承的項目安裝程式類,然後將該類上的 RunInstallerAttribute 設定為 true。在項目中,為每個服務應用程式執行個體化一個 ServiceProcessInstaller 執行個體,並為應用程式中的每個服務執行個體化一個ServiceInstaller 執行個體。最後,向項目安裝程式類添加 ServiceProcessInstaller 執行個體和 ServiceInstaller 執行個體。
當 InstallUtil.exe 運行時,該工具 + 生產力在服務程式集內尋找 RunInstallerAttribute 設定為 true 的類。通過將類添加到與項目安裝程式關聯的 Installers 集合來向服務程式集添加類。如果 RunInstallerAttribute 為 false,安裝工具 + 生產力將忽略項目安裝程式。
對於 ServiceProcessInstaller 執行個體,可修改的屬性包括指定服務應用程式在登入使用者之外的帳戶下運行。可指定運行該服務所使用的特定UserName 和Password 對,或者可使用Account 指定該服務是在電腦的系統帳戶、本地或網路服務帳戶還是使用者帳戶下運行。(注意:電腦的“系統”帳戶與“管理員”帳戶不同。)
ServiceInstaller:安裝一個類,該類擴充 ServiceBase 來實現服務。在安裝服務應用程式時由安裝工具 + 生產力調用該類。ServiceInstaller 執行特定於其所關聯服務的操作。它由安裝工具 + 生產力用來將與服務關聯的註冊表值寫入 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 登錄機碼內的子項。服務由它在該子鍵內的“服務名”(ServiceName) 標識。該子鍵還包含服務所屬的可執行檔或 .dll 的名稱。
以上至列出簡要介紹,更詳盡的介紹請參見MSDN.
下面簡要介紹服務的是實現過程。
一、.NET 2.0平台上不能直接建立windows服務項目。在.NET 2.0平台上開發windows服務,需要自己建立工程,然後添加安裝程式(Installer.cs)和window服務(Service.cs)。然後在,安裝程式檔案和window服務檔案中分別編寫程式碼完成。
環境介紹:.NET2.0 SP2.(我電腦上面不能直接建立,但是我同事電腦能直接建立Windows服務。沒鬧明白這兩個SP2區別在哪。但是他的版本應該比我的高)
過程如下:
1.建立項目(我開發的時候直接建立的Winfrom項目),右擊項目,在選擇添加安裝程式(Installer.cs)和window服務(Service.cs)分別添加到項目中。如:
2.在Service.cs中using System.ServiceProcess命名空間。
ServiceInstaller installer = new ServiceInstaller();
//設定服務名稱
installer.ServiceName = "TestDemo";
//設定服務的啟動類型。下面設定的啟動方式為自動啟動
installer.StartType = ServiceStartMode.Automatic;
//設定服務的描述
installer.Description = "測試服務";
//申明服務安裝對象(在使用安裝服務工具時,它會被工具調用以完成服務安裝)
ServiceProcessInstaller processer = new ServiceProcessInstaller();
//設定服務的賬戶。下面設定的為本地系統
processer.Account = ServiceAccount.LocalSystem;
//將安裝服務執行個體與安裝處理對象添加到安裝程式的集合。
Installers.Add(installer);
Installers.Add(processer);
3.在以下方法中編寫服務啟動以及服務停止時的代碼
protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
4.將program.cs中的入口函數(main函數)中,改為ServiceBase.Run(new Service1())
5.產生.exe檔案
二、在.NET3.5平台上開發windows服務可以直接在建立項目上鍵一個window服務項目,裡面直接就有了Service.cs檔案,使用者可以添加為他添加安裝程式以完成windows服務的開發。
環境介紹:.NET3.5SP2.
1.右擊Service1.cs查看設計器。然後在設計器重右擊選擇菜單中的添加安裝程式,系統會為此服務添加安裝程式的檔案ProjectInstall .cs(預設名稱,當然你也可以修改)。
2.同樣的方式查看ProjectInstall .cs中右擊,選擇查看設計器。在他的設計器重預設有兩個檔案:ServiceProcessInstaller1和ServiceInstaller1.cs。
3.設定ServiceProcessInstaller1和ServiceInstaller1.cs的屬性。將ServiceProcessInstaller1的Account設定為LocalSystem.當然你也可以設定為其他的。若你將 其設定為User則你需要在安裝服務的時候設定服務登陸。我例子中 ServiceProcessInstaller1屬性的設定如:
ServiceInstaller1.cs的屬性設定如:
其中他的屬性設定和2.0平台上的的上述例子的installer屬性設定一樣。只是一個通過屬性設定、一個通過代碼設定。
3.編寫服務實現的功能。如下為我做的服務測試的功能:每一秒向指定文本將目前時間寫進去。
System.Timers.Timer timer;
public Service1()
{
InitializeComponent();
this.ServiceName = "TestDemo";
}
protected override void OnStart(string[] args)
{
timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.AutoReset = true;
try
{
timer.Start();
}
catch(ArgumentOutOfRangeException Ex)
{
throw Ex;
}
}
protected override void OnStop()
{
timer.Stop();
timer = null;
}
private void timer_Elapsed(object obj, EventArgs args)
{
using (FileStream fs = new FileStream(@"D:\test.txt", FileMode.Append, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(DateTime.Now.ToString());
}
}
}
4.編譯項目,產生安裝檔案
三、服務的安裝。
不管在2.0平台還是3.5平台,對windows服務的安裝都是 通過installutil工具完成的。使用方法如下:
1.開啟VS2008下的命令提示。
2.輸入installutil D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe,即可完成服務的安裝。安裝成功後的命令介面太大這裡就不截取了。安裝成功的服務
可以在電腦的服務中找到。如下
3》服務的卸載:輸入installutil /u D:\Visual2008\WindowsService\WindowsService1\WindowsService1\bin\Release\WindowsService1.exe即可完成服務的卸載。若此時服務正在運行中,也可卸載(它會先嘗試關閉服務,然後卸載)。如:
做完這些後,就可以在D:\test.txt中看到每個一秒的時間記錄。
就寫到這裡了,希望對進行相關開發的朋友們有所協助!
注意:使用installutil工具安裝服務時候,如果路徑中存在空格,安裝會報錯。