小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

C# 編寫(xiě)Window服務(wù)基礎(chǔ)(一)

 昵稱10504424 2013-12-24

一.Windows服務(wù)介紹:
Windows服務(wù)以前被稱作NT服務(wù),是一些運(yùn)行在Windows NT、Windows 2000和Windows XP等操作系統(tǒng)下用戶環(huán)境以外的程序。在以前,編寫(xiě)Windows服務(wù)程序需要程序員很強(qiáng)的C或C++功底。然而現(xiàn)在在Visual Studio.Net下,你可以運(yùn)用C++或Visual C#或Visual Basic.Net很輕松的創(chuàng)建一個(gè)Windows服務(wù)程序。同樣,你還可以運(yùn)用其他任何與CLR相容的語(yǔ)言來(lái)創(chuàng)建Windows服務(wù)程序。本文就向大家介紹如何運(yùn)用Visual C#來(lái)一步一步創(chuàng)建一個(gè)文件監(jiān)視的Windows服務(wù)程序,然后介紹如何安裝、測(cè)試和調(diào)試該Windows服務(wù)程序。
在介紹如何創(chuàng)建Windows服務(wù)程序以前,我先向大家介紹一些有關(guān)Windows服務(wù)的背景知識(shí)。一個(gè)Windows服務(wù)程序是在Windows操作系統(tǒng)下能完成特定功能的可執(zhí)行的應(yīng)用程序。Windows服務(wù)程序雖然是可執(zhí)行的,但是它不像一般的可執(zhí)行文件通過(guò)雙擊就能開(kāi)始運(yùn)行了,它必須有特定的啟動(dòng)方式。這些啟動(dòng)方式包括了自動(dòng)啟動(dòng)和手動(dòng)啟動(dòng)兩種。對(duì)于自動(dòng)啟動(dòng)的Windows服務(wù)程序,它們?cè)赪indows啟動(dòng)或是重啟之后用戶登錄之前就開(kāi)始執(zhí)行了。只要你將相應(yīng)的Windows服務(wù)程序注冊(cè)到服務(wù)控制管理器(Service Control Manager)中,并將其啟動(dòng)類別設(shè)為自動(dòng)啟動(dòng)就行了。而對(duì)于手動(dòng)啟動(dòng)的Windows服務(wù)程序,你可以通過(guò)命令行工具的NET START 命令來(lái)啟動(dòng)它,或是通過(guò)控制面板中管理工具下的服務(wù)一項(xiàng)來(lái)啟動(dòng)相應(yīng)的Windows服務(wù)程序(見(jiàn)圖1)。同樣,一個(gè)Windows服務(wù)程序也不能像一般的應(yīng)用程序那樣被終止。因?yàn)閃indows服務(wù)程序一般是沒(méi)有用戶界面的,所以你也要通過(guò)命令行工具或是下面圖中的工具來(lái)停止它,或是在系統(tǒng)關(guān)閉時(shí)使得 Windows服務(wù)程序自動(dòng)停止。因?yàn)閃indows服務(wù)程序沒(méi)有用戶界面,所以基于用戶界面的API函數(shù)對(duì)其是沒(méi)有多大的意義。為了能使一個(gè) Windows服務(wù)程序能夠正常并有效的在系統(tǒng)環(huán)境下工作,程序員必須實(shí)現(xiàn)一系列的方法來(lái)完成其服務(wù)功能。Windows服務(wù)程序的應(yīng)用范圍很廣,典型的 Windows服務(wù)程序包含了硬件控制、應(yīng)用程序監(jiān)視、系統(tǒng)級(jí)應(yīng)用、診斷、報(bào)告、Web和文件系統(tǒng)服務(wù)等功能。
圖1

二.創(chuàng)建Windows服務(wù)程序:
在介紹如何創(chuàng)建Windows服務(wù)程序以前,我先向大家介紹一下.Net框架下與Windows服務(wù)相關(guān)的命名空間和其中的類庫(kù)。.Net框架大大地簡(jiǎn)化了Windows服務(wù)程序的創(chuàng)建和控制過(guò)程,這要?dú)w功于其命名空間中的功能強(qiáng)大的類庫(kù)。和Windows服務(wù)程序相關(guān)的命名空間涉及到以下兩個(gè):System.ServiceProcess和System.Diagnostics。
要?jiǎng)?chuàng)建一個(gè)最基本的Windows服務(wù)程序,我們只需要運(yùn)用.Net框架下的System.ServiceProcess命名空間以及其中的四個(gè)類:ServiceBase、ServiceInstaller、ServiceProcessInstaller以及 ServiceController,其體系結(jié)構(gòu)可見(jiàn)圖2。
圖2

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

protected override void OnStart(string[] args)

{

}

protected override void OnStop()

{

}

protected override void OnPause()

{

}

protected override void OnContinue()

{

}

ServiceBase類還為我們提供了一些屬性,而這些屬性是任何Widnows服務(wù)程序所必須的。其中的ServiceName屬性指定了 Windows服務(wù)的名稱,通過(guò)該名稱系統(tǒng)就可以調(diào)用Windows服務(wù)了,同時(shí)其它應(yīng)用程序也可以通過(guò)該名稱來(lái)調(diào)用它的服務(wù)。而 CanPauseAndContinue和CanStop屬性顧名思義就是允許暫停并恢復(fù)和允許停止的意思。
要使得一個(gè)Windows服務(wù)程序能夠正常運(yùn)行,我們需要像創(chuàng)建一般應(yīng)用程序那樣為它創(chuàng)建一個(gè)程序的入口點(diǎn)。在Windows服務(wù)程序中,我們也是在 Main()函數(shù)中完成這個(gè)操作的。首先我們?cè)贛ain()函數(shù)中創(chuàng)建一個(gè)Windows服務(wù)的實(shí)例,該實(shí)例應(yīng)該是ServiceBase類的某個(gè)子類的對(duì)象,然后我們調(diào)用由基類ServiceBase類定義的一個(gè)Run()方法。然而Run()方法并不就開(kāi)始了Windows服務(wù)程序,我們必須通過(guò)前面提到的服務(wù)控制管理器調(diào)用特定的控制功能來(lái)完成Windows服務(wù)程序的啟動(dòng),也就是要等到該對(duì)象的OnStart()方法被調(diào)用時(shí)服務(wù)才真正開(kāi)始運(yùn)行。如果你想在一個(gè)Windows服務(wù)程序中同時(shí)啟動(dòng)多個(gè)服務(wù),那么只要在Main()函數(shù)中定義多個(gè)ServiceBae類的子類的實(shí)例對(duì)象就可以了,方法就是創(chuàng)建一個(gè)ServiceBase類的數(shù)組對(duì)象,使得其中的每個(gè)對(duì)象對(duì)應(yīng)于某個(gè)我們已預(yù)先定義好的服務(wù)。

{

System.ServiceProcess.ServiceBase[] MyServices;

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

System.ServiceProcess.ServiceBase.Run(MyServices);

}

static void Main()
三.添加文件監(jiān)視服務(wù):
了解了Windows服務(wù)的基本體系結(jié)構(gòu)和創(chuàng)建方法后,我們就可以試著往服務(wù)中添加一些實(shí)際的功能了。下面我將向大家介紹一個(gè)能監(jiān)視本地文件系統(tǒng)的文件監(jiān)視服務(wù)-FileMonitorService。該服務(wù)能根據(jù)預(yù)先設(shè)定的本地目錄路徑監(jiān)視其中的文件包括子文件夾中的任何變化:文件創(chuàng)建、文件刪除、文件改名、文件修改。同時(shí),該服務(wù)還為每種變化創(chuàng)建了一個(gè)相對(duì)應(yīng)的計(jì)數(shù)器,計(jì)數(shù)器的作用就是反映該種變化的頻度。
首先,我們打開(kāi)Visual Studio.Net,新建一個(gè)Visual C#的Windows服務(wù)的項(xiàng)目,如圖3所示:
圖3

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

private System.Diagnostics.PerformanceCounter fileCreateCounter;

private System.Diagnostics.PerformanceCounter fileDeleteCounter;

private System.Diagnostics.PerformanceCounter fileRenameCounter;

private System.Diagnostics.PerformanceCounter fileChangeCounter;

之后我們便在類的InitializeComponent()方法中創(chuàng)建以上定義的各個(gè)計(jì)數(shù)器對(duì)象并確定其相關(guān)屬性。同時(shí)我們將該Windows服務(wù)的名稱設(shè)置為“FileMonitorService”,設(shè)定其即是允許暫停并恢復(fù)的又是允許停止的。

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()函數(shù)和OnStop()函數(shù),OnStart()函數(shù)完成了一些必要的初始化工作。在.Net框架下,文件的監(jiān)視功能可以由FileSystemWatcher類來(lái)完成,該類是包含在System.IO命名空間下的。該Windows服務(wù)所要完成的功能包括了監(jiān)視文件的創(chuàng)建、刪除、改名和修改等變化,而FileSystemWatcher類包含所有了對(duì)應(yīng)于這些變化的處理函數(shù)。

protected override void OnStart(string[] args)

{

FileSystemWatcher curWatcher = new FileSystemWatcher();

curWatcher.BeginInit();

curWatcher.IncludeSubdirectories = true;

curWatcher.Path =

System.Configuration.ConfigurationSettings.AppSettings

["FileMonitorDirectory"];

curWatcher.Changed += new FileSystemEventHandler(OnFileChanged);

curWatcher.Created += new FileSystemEventHandler(OnFileCreated);

curWatcher.Deleted += new FileSystemEventHandler(OnFileDeleted);

curWatcher.Renamed += new RenamedEventHandler(OnFileRenamed);

curWatcher.EnableRaisingEvents = true;

curWatcher.EndInit();

}

注意其中被監(jiān)視的目錄是存放在一個(gè)應(yīng)用程序配置文件中的,該文件是一個(gè)XML類型的文件。這種做法的好處就是我們不必重新編譯并發(fā)布該Windows服務(wù)而只要直接修改其配置文件就可以達(dá)到更改所要監(jiān)視的目錄的功能了。
當(dāng)該Windows服務(wù)啟動(dòng)后,一旦被監(jiān)視的目錄中的文件發(fā)生某種變化,與其相對(duì)應(yīng)的計(jì)數(shù)器的值便會(huì)相應(yīng)的增加,方法很簡(jiǎn)單,只要調(diào)用計(jì)數(shù)器對(duì)象的IncrementBy()即可。

private void OnFileChanged(Object source, FileSystemEventArgs e)

{

if( servicePaused == false )

{

fileChangeCounter.IncrementBy(1);

}

}

private void OnFileRenamed(Object source, RenamedEventArgs e)

{

if( servicePaused == false )

{

fileRenameCounter.IncrementBy(1);

}

}

private void OnFileCreated(Object source, FileSystemEventArgs e)

{

if( servicePaused == false )

{

fileCreateCounter.IncrementBy(1);

}

}

private void OnFileDeleted(Object source, FileSystemEventArgs e)

{

if( servicePaused == false )

{

fileDeleteCounter.IncrementBy(1);

}

}

OnStop()函數(shù)即是停止Windows服務(wù)的,在該Windows服務(wù)中,服務(wù)一旦停止,所有的計(jì)數(shù)器的值都應(yīng)歸零,但是計(jì)數(shù)器并不提供一個(gè)Reset()方法,所以我們只好將計(jì)數(shù)器中的值減去當(dāng)前值來(lái)達(dá)到這個(gè)目的。

protected override void OnStop()

{

if( fileChangeCounter.RawValue != 0 )

{

fileChangeCounter.IncrementBy(-fileChangeCounter.RawValue);

}

if( fileDeleteCounter.RawValue != 0 )

{

fileDeleteCounter.IncrementBy(-fileDeleteCounter.RawValue);

}

if( fileRenameCounter.RawValue != 0 )

{

fileRenameCounter.IncrementBy(-fileRenameCounter.RawValue);

}

if( fileCreateCounter.RawValue != 0 )

{

fileCreateCounter.IncrementBy(-fileCreateCounter.RawValue);

}

}

同時(shí),因?yàn)槲覀兊腤indows服務(wù)是允許暫停并恢復(fù)的,所以我們還得重載OnPause()函數(shù)和OnContinue()函數(shù),方法很簡(jiǎn)單,只要設(shè)定前面定義的布爾值servicePaused即可。

protected override void OnPause()

{

servicePaused = true;

}

protected override void OnContinue()

{

servicePaused = false;

}

這樣,該Windows服務(wù)的主體部分已經(jīng)完成了,不過(guò)它并不有用,我們還必須為其添加安裝文件。安裝文件為Windows服務(wù)的正確安裝做好了工作,它包括了一個(gè)Windows服務(wù)的安裝類,該類是重System.Configuration.Install.Installer繼承過(guò)來(lái)的。安裝類中包括了Windows服務(wù)運(yùn)行所需的賬號(hào)信息,用戶名、密碼信息以及Windows服務(wù)的名稱,啟動(dòng)方式等信息。

[RunInstaller(true)]

public class Installer1 : System.Configuration.Install.Installer

{

/// <summary>

/// 必需的設(shè)計(jì)器變量。

/// </summary>

private System.ComponentModel.Container components = null;

private System.ServiceProcess.ServiceProcessInstaller spInstaller;

private System.ServiceProcess.ServiceInstaller sInstaller;

public Installer1()

{

// 該調(diào)用是設(shè)計(jì)器所必需的。

InitializeComponent();

// TODO: 在 InitComponent 調(diào)用后添加任何初始化

}

#region Component Designer generated code

/// <summary>

/// 設(shè)計(jì)器支持所需的方法 - 不要使用代碼編輯器修改

/// 此方法的內(nèi)容。

/// </summary>

private void InitializeComponent()

{

components = new System.ComponentModel.Container();

// 創(chuàng)建ServiceProcessInstaller對(duì)象和ServiceInstaller對(duì)象

this.spInstaller =

new System.ServiceProcess.ServiceProcessInstaller();

this.sInstaller = new System.ServiceProcess.ServiceInstaller();

// 設(shè)定ServiceProcessInstaller對(duì)象的賬號(hào)、用戶名和密碼等信息

this.spInstaller.Account =

System.ServiceProcess.ServiceAccount.LocalSystem;

this.spInstaller.Username = null;

this.spInstaller.Password = null;

// 設(shè)定服務(wù)名稱

this.sInstaller.ServiceName = "FileMonitorService";

// 設(shè)定服務(wù)的啟動(dòng)方式

this.sInstaller.StartType =

System.ServiceProcess.ServiceStartMode.Automatic;

this.Installers.AddRange(

new System.Configuration.Install.Installer[]

{this.spInstaller, this.sInstaller });

}

#endregion

}

同樣,因?yàn)樵揥indows服務(wù)中運(yùn)用到了計(jì)數(shù)器對(duì)象,我們也要為其添加相應(yīng)的安裝文件,安裝文件的內(nèi)容和作用與前面的類似。限于篇幅,這里就不給出相應(yīng)的代碼了,有興趣的讀者可以參考文后附帶的源代碼文件。
到此為止,整個(gè)Windows服務(wù)已經(jīng)構(gòu)建完畢,不過(guò)Windows服務(wù)程序和一般的應(yīng)用程序不同,它不能直接調(diào)試運(yùn)行。如果你直接在IDE下試圖調(diào)試運(yùn)行之,就會(huì)報(bào)出如圖4所示提示。
圖4

根據(jù)其中提示,我們知道安裝Windows服務(wù)需要用到一個(gè)名為InstallUtil.exe的命令行工具。而運(yùn)用該工具安裝Windows服務(wù)的方法是非常簡(jiǎn)單的,安裝該Windows服務(wù)的命令如下:

installutil FileMonitorService.exe

而要卸載該Windows服務(wù),你只要輸入如下的命令即可:

installutil /u FileMonitorService.exe

Windows服務(wù)安裝成功后,它便會(huì)出現(xiàn)在服務(wù)控制管理器中,如圖5所示。
圖5

這樣,該文件監(jiān)視的Windows服務(wù)就完成了,一旦我們對(duì)被監(jiān)視的目錄中的文件進(jìn)行操作,相應(yīng)的計(jì)數(shù)器就會(huì)運(yùn)作,起到監(jiān)視文件變化的作用。不過(guò)這個(gè)功能對(duì)于一般的用戶而言沒(méi)多大意義,然而你可以在此基礎(chǔ)上添加新的功能,比如構(gòu)建一個(gè)后臺(tái)的文件處理系統(tǒng),一旦被監(jiān)視的目錄中的文件發(fā)生某種變化,Windows服務(wù)便對(duì)其進(jìn)行特定的操作,而最終用戶就不必去關(guān)心后臺(tái)處理程序是如何實(shí)現(xiàn)的了。
四.總結(jié):
本文向大家介紹了Windows服務(wù)的一些基本概念和構(gòu)建一般的Windows服務(wù)所需的方法,同時(shí)還向大家展示了一個(gè)具有文件監(jiān)視功能的 Windows服務(wù)程序。通過(guò)本文,讀者應(yīng)該能體會(huì)到構(gòu)建Windows服務(wù)并不是想象中的那么復(fù)雜,這主要還得歸功于.Net框架為我們所作的大量努力。同時(shí),希望大家能在本文給出的實(shí)例的基礎(chǔ)上構(gòu)建更加完善和更加強(qiáng)大的Windows服務(wù)程序。最后希望本文對(duì)大家能有不少幫助。

(注:源代碼文件為Source.rar)

三、安裝、卸載window服務(wù)

1、輸入cmd(命令行),輸入cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319,2.0為cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

2、安裝服務(wù)(項(xiàng)目生成的exe文件路徑)

將InstallUtil.exe文件與WindowsService.exe,WindowsService.exe.config放在一個(gè)文件夾

創(chuàng)建一個(gè).bat文件: InstallUtil /i WindowsService.exe

InstallUtil "E:\WindowsService1\bin\Debug\WindowsService1.exe"

3、卸載服務(wù)

InstallUtil /u "E:\WindowsService1\bin\Debug\WindowsService1.exe"

四、查看window服務(wù)

services.msc

控制面板-->管理工具-->服務(wù),可在此手動(dòng)啟動(dòng),停止服務(wù)

五、調(diào)試window服務(wù)

1、通過(guò)【事件查看器】查看

2、直接在程序中調(diào)試(菜單-->調(diào)試-->附加進(jìn)程-->服務(wù)名(這里的服務(wù)名是項(xiàng)目名稱,不是ServiceName屬性自定義的名稱,所以建議自定義名稱和項(xiàng)目名稱保持一致,另外需勾選【顯示所有用戶的進(jìn)程】才能看到服務(wù)名)-->附加

這里附加的進(jìn)程名應(yīng)該是:WindowsService1.exe 而不是 WindowsService1.vshost.exe。WindowsService1.exe 默認(rèn)不會(huì)出現(xiàn),必須勾選【顯示所有用戶的進(jìn)程】【顯示所有會(huì)話中的進(jìn)程】

3. 在程序中打斷點(diǎn)調(diào)試即可,另外調(diào)試服務(wù)時(shí)服務(wù)必須已啟動(dòng)(管理工具-->服務(wù))

使用InstallUtil安裝Window服務(wù)

InstallUtil 命令的所在目錄:Microsoft.NET/Framework/Vx.x.xxxx

示例:

安裝服務(wù)
InstallUtil YourService.exe

卸載服務(wù)
InstallUtil /u YourService.exe
InstallUtil命令幫助

InstallUtil /?

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多