如何使用Visual C#來創建Windows服務程序

一.Windows服務介紹:

  Windows服務以前被稱作NT服務,是一些運行在Windows NT、Windows 2000和Windows XP等操作系統下用戶環境以外的程序。在以前,編寫Windows服務程序需要程序員很強的C或C++功底。然而現在在Visual Studio.Net下,你可以運用C++或Visual C#或Visual Basic.Net很輕鬆的創建一個Windows服務程序。同樣,你還可以運用其他任何與CLR相容的語言來創建Windows服務程序。本文就向大家介紹如何運用Visual C#來一步一步創建一個文件監視的Windows服務程序,然後介紹如何安裝、測試和調試該Windows服務程序。

  在介紹如何創建Windows服務程序以前,我先向大家介紹一些有關Windows服務的背景知識。一個Windows服務程序是在Windows操作系統下能完成特定功能的可執行的應用程序。Windows服務程序雖然是可執行的,但是它不像一般的可執行文件通過雙擊就能開始運行了,它必須有特定的啓動方式。這些啓動方式包括了自動啓動和手動啓動兩種。對於自動啓動的Windows服務程序,它們在Windows啓動或是重啓之後用戶登錄之前就開始執行了。只要你將相應的Windows服務程序註冊到服務控制管理器(Service Control Manager)中,並將其啓動類別設爲自動啓動就行了。而對於手動啓動的Windows服務程序,你可以通過命令行工具的NET START 命令來啓動它,或是通過控制面板中管理工具下的服務一項來啓動相應的Windows服務程序(見圖1)。同樣,一個Windows服務程序也不能像一般的應用程序那樣被終止。因爲Windows服務程序一般是沒有用戶界面的,所以你也要通過命令行工具或是下面圖中的工具來停止它,或是在系統關閉時使得Windows服務程序自動停止。因爲Windows服務程序沒有用戶界面,所以基於用戶界面的API函數對其是沒有多大的意義。爲了能使一個Windows服務程序能夠正常並有效的在系統環境下工作,程序員必須實現一系列的方法來完成其服務功能。Windows服務程序的應用範圍很廣,典型的Windows服務程序包含了硬件控制、應用程序監視、系統級應用、診斷、報告、Web和文件系統服務等功能。

  圖1



  二.創建Windows服務程序:

在介紹如何創建Windows服務程序以前,我先向大家介紹一下.Net框架下與Windows服務相關的命名空間和其中的類庫。.Net框架大大地簡化了Windows服務程序的創建和控制過程,這要歸功於其命名空間中的功能強大的類庫。和Windows服務程序相關的命名空間涉及到以下兩個:System.ServiceProcess和System.Diagnostics。

要創建一個最基本的Windows服務程序,我們只需要運用.Net框架下的System.ServiceProcess命名空間以及其中的四個類:ServiceBase、ServiceInstaller、ServiceProcessInstaller以及ServiceController,其體系結構可見圖2。

  圖2



  其中ServiceBase類定義了一些可被其子類重載的函數,通過這些重載的函數,服務控制管理器就可以控制該Windows服務程序了。這些函數包括:OnStart()、OnStop()、OnPause()以及OnContinue()等四個。而且ServiceBase類的子類還可以重載OnCustomCommand()函數來完成一些特定的操作。通過重載以上的一些函數,我們就完成了一個Windows服務程序的基本框架,這些函數的重載方法如下:

protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
protected override void OnPause()
{
}
protected override void OnContinue()
{
}


  ServiceBase類還爲我們提供了一些屬性,而這些屬性是任何Widnows服務程序所必須的。其中的ServiceName屬性指定了Windows服務的名稱,通過該名稱系統就可以調用Windows服務了,同時其它應用程序也可以通過該名稱來調用它的服務。而CanPauseAndContinue和CanStop屬性顧名思義就是允許暫停並恢復和允許停止的意思。

  要使得一個Windows服務程序能夠正常運行,我們需要像創建一般應用程序那樣爲它創建一個程序的入口點。在Windows服務程序中,我們也是在Main()函數中完成這個操作的。首先我們在Main()函數中創建一個Windows服務的實例,該實例應該是ServiceBase類的某個子類的對象,然後我們調用由基類ServiceBase類定義的一個Run()方法。然而Run()方法並不就開始了Windows服務程序,我們必須通過前面提到的服務控制管理器調用特定的控制功能來完成Windows服務程序的啓動,也就是要等到該對象的OnStart()方法被調用時服務才真正開始運行。如果你想在一個Windows服務程序中同時啓動多個服務,那麼只要在Main()函數中定義多個ServiceBae類的子類的實例對象就可以了,方法就是創建一個ServiceBase類的數組對象,使得其中的每個對象對應於某個我們已預先定義好的服務。

{
System.ServiceProcess.ServiceBase[] MyServices;
MyServices = new System.ServiceProcess.ServiceBase[] { new Service1(), new Service2() };
System.ServiceProcess.ServiceBase.Run(MyServices);
}


static void Main()

  三.添加文件監視服務:

  瞭解了Windows服務的基本體系結構和創建方法後,我們就可以試着往服務中添加一些實際的功能了。下面我將向大家介紹一個能監視本地文件系統的文件監視服務-FileMonitorService。該服務能根據預先設定的本地目錄路徑監視其中的文件包括子文件夾中的任何變化:文件創建、文件刪除、文件改名、文件修改。同時,該服務還爲每種變化創建了一個相對應的計數器,計數器的作用就是反映該種變化的頻度。

  首先,我們打開Visual Studio.Net,新建一個Visual C#的Windows服務的項目,如圖3所示:

  圖3



  在重載Windows服務的OnStart()函數之前,我們先給其類添加一些計數器對象,這些計數器分別對應了文件的創建、刪除、改名以及修改等變化。一旦指定目錄中的文件發生以上的某種變化,與其相對應的計數器就會自動加1。所有的這些計數器都是定義爲PerformanceCounter類型的變量的,該類是包含在System.Diagnostics命名空間中的。

private System.Diagnostics.PerformanceCounter fileCreateCounter;
private System.Diagnostics.PerformanceCounter fileDeleteCounter;
private System.Diagnostics.PerformanceCounter fileRenameCounter;
private System.Diagnostics.PerformanceCounter fileChangeCounter;


  之後我們便在類的InitializeComponent()方法中創建以上定義的各個計數器對象並確定其相關屬性。同時我們將該Windows服務的名稱設置爲“FileMonitorService”,設定其即是允許暫停並恢復的又是允許停止的。

private void InitializeComponent()
 {
 this.components = new System.ComponentModel.Container();
 this.fileChangeCounter = new System.Diagnostics.PerformanceCounter();
 this.fileDeleteCounter = new System.Diagnostics.PerformanceCounter();
 this.fileRenameCounter = new System.Diagnostics.PerformanceCounter();
 this.fileCreateCounter = new System.Diagnostics.PerformanceCounter();

 fileChangeCounter.CategoryName = "File Monitor Service";
 fileDeleteCounter.CategoryName = "File Monitor Service";
 fileRenameCounter.CategoryName = "File Monitor Service";
 fileCreateCounter.CategoryName = "File Monitor Service";

 fileChangeCounter.CounterName = "Files Changed";
 fileDeleteCounter.CounterName = "Files Deleted";
 fileRenameCounter.CounterName = "Files Renamed";
 fileCreateCounter.CounterName = "Files Created";

 this.ServiceName = "FileMonitorService";
 this.CanPauseAndContinue = true;
 this.CanStop = true;
 servicePaused = false;
 }


  接着就是重載OnStart()函數和OnStop()函數,OnStart()函數完成了一些必要的初始化工作。在.Net框架下,文件的監視功能可以由FileSystemWatcher類來完成,該類是包含在System.IO命名空間下的。該Windows服務所要完成的功能包括了監視文件的創建、刪除、改名和修改等變化,而FileSystemWatcher類包含所有了對應於這些變化的處理函數。

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