.Net 平臺下開發Windows服務
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工具安裝服務時候,如果路徑中存在空格,安裝會報錯。
浙公網安備 33010602011771號