windows 服務開發教程


一、 window服務是什么

 

當你單擊“開始”,執行“services.msc”命令。就會看見如下窗口。它顯示的是當前操作系統中系統自帶的服務或者第三方軟件安裝的服務。服務的狀態有名稱、描述、啟動狀態、啟動類型等等。你也可以在此窗體中管理相關服務,注意謹慎操作,防止系統錯誤或軟件故障。

clip_image002

在此,為了讓大家對后面使用的代碼項目有個整體了解。整個專案有如下項目:

1、ServerForm: 一個WinForm程序,為window服務MyService測試而調用(永遠只彈出一個,除非之前彈出的ServerForm的關閉)。

2、CreateWSSetup:一個Console程序,為window服務MyService

生成安裝和卸載腳本而使用。並且在服務安裝包MyServiceSetup中調用。傳入參數install標識安裝和啟動服務,unstall表示停止和卸載服務。

3、MyService: 我們今天的重點,一個Window服務程序。

4、MyServiceSetup:一個Window服務的安裝包程序。支持Window服務MyService的安裝和啟動、停止和卸載。

clip_image004

 

 

二、 Window服務如何開發

 

在這里只從C#.NET開發的角度,來簡單介紹Window服務的開發。

1、 新建一個Window服務項目。

clip_image006

 

2、 編寫MyService主要代碼

MyService類繼承微軟封裝的服務基類ServiceBase

public partial class MyService : ServiceBase

服務啟動OnStart(string[] args),你可以選擇是否帶傳入參數來執行服務。

 

// 啟動服務

protected override void OnStart(string[] args)

{

// 在此處添加代碼以啟動服務

timer.Enabled = true;

}

 

服務停止OnStopt()

// 停止服務

protected override void OnStop()

{

// 在此處添加代碼以執行停止服務所需的關閉操作。

timer.Enabled = false;

System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");

if (myproc != null && myproc.Length > 0)

{

int n = myproc.Length;

for (int i = 0; i < n; i++)

{

myproc[i].Kill();

}

}

}

 

此處為自定義函數,實現定時彈出第三方程序頁面。ServerForm是另外一個C#.NET的WinForm程序。我們把它放到

MyService\Bin\Debug下面。

 

// 定時執行

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

{

System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");

if (myproc == null || myproc.Length == 0)

{

// 控制程序, 單例執行

System.Diagnostics.Process.Start(AppDomain.CurrentDomain.BaseDirectory + "ServerForm.exe");

}

}

 

最后,我們看下完整的MyService代碼

public partial class MyService : ServiceBase

{

private static System.Timers.Timer timer = null;

// 服務構造

public MyService()

{

InitializeComponent();

if (timer == null)

{

timer = new System.Timers.Timer();

timer.Enabled = true;

timer.Interval = 10000; // 10秒

timer.Elapsed += new System.Timers.ElapsedEventHandler(this.timer_Elapsed);

this.ServiceName = "MyService";

}

}

// 啟動服務

protected override void OnStart(string[] args)

{

// 在此處添加代碼以啟動服務

timer.Enabled = true;

}

// 停止服務

protected override void OnStop()

{

// 在此處添加代碼以執行停止服務所需的關閉操作。

timer.Enabled = false;

System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");

if (myproc != null && myproc.Length > 0)

{

int n = myproc.Length;

for (int i = 0; i < n; i++)

{

myproc[i].Kill();

}

}

}

// 定時執行

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

{

System.Diagnostics.Process[] myproc = System.Diagnostics.Process.GetProcessesByName("ServerForm");

if (myproc == null || myproc.Length == 0)

{

// 控制程序, 單例執行

System.Diagnostics.Process.Start(AppDomain.CurrentDomain.BaseDirectory + "ServerForm.exe");

}

}

}

配置服務的Install組件。當我們寫好一個MyService.cs服務后,它還不能直接安裝和注冊。我們還需要為它配置Install安裝組件,具體操作步驟如下:

步驟1:選中服務MyService.cs,雙擊鼠標。在VS2008左邊區域彈出MyService.cs[設計]*選項卡。

clip_image008

 

步驟2:在“MyService.cs[設計]*選項卡”中,右鍵鼠標單擊選項“添加安裝程序”。

clip_image010

在執行“添加安裝程序”之后,可以看見項目中多了如下文件和組件。

clip_image012

 

步驟3:設置安裝服務的相關屬性

1、設置組件serviceInstaller1的主要屬性

StartType: AutoMatic自動、Manual手動,Disabled禁止。

ServiceName: 服務系統標識,

在cmd命令中執行sr start/stop/query等等命令時候使用,用來唯一標識一個Window服務。

clip_image014

 

2、設置組件serviceProcessInstaller1的主要屬性

Accout:賬戶類型。LocalService基於本機運行服務、NetworkService基於網絡運行服務、LocalSystem本地系統服務、User基於用戶認證的服務。

clip_image016

 

3、 設置服務安裝后“允許和桌面進行交互”,

需要在ProjectInstaller.cs中添加如下代碼。

namespace MyService

{

[RunInstaller(true)]

public partial class ProjectInstaller : Installer

{

public ProjectInstaller()

{

InitializeComponent();

}

protected override void OnAfterInstall(IDictionary savedState)

{

try

{

base.OnAfterInstall(savedState);

// 允許服務桌面交互

System.Management.ManagementObject myService = new System.Management.ManagementObject(string.Format("Win32_Service.Name='{0}'", this.serviceInstaller1.ServiceName));

System.Management.ManagementBaseObject changeMethod = myService.GetMethodParameters("Change");

changeMethod["DesktopInteract"] = true;

System.Management.ManagementBaseObject OutParam = myService.InvokeMethod("Change", changeMethod, null);

}

catch (Exception ex)

{

}

}

}

}

 

三、 Windows服務的安裝和卸載

 

注意:在執行安裝或卸載服務前,我有把服務需要的相關文件,復制到C:\MyService\下面或其他路徑。一旦安裝完成后,此目錄不能變更,否則不能卸載該服務和服務運行會報錯。

方法一:cmd命令方式

單擊開始,執行cmd命令。在彈出cmd窗口中安裝或卸載服務。

1、 安裝服務: sr start為啟動服務

基本命令,如下:

%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe C:\MyService\MyService.exe

sc start "TaskWS"

步驟1:安裝MyServie服務,如下圖:

clip_image018

執行安裝命令,接着顯示安裝和注冊服務的結果消息,如下圖。

clip_image020 

步驟2:如上圖,顯示結果安裝服務成功,接下來我們去服務管理界面,查看服務是否出現。如下圖所示。

clip_image022

步驟3:接下來啟動MyService服務:執行sc start "MyService"命令。

clip_image024

 

2、卸載服務

sc stop "MyService"

%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe /u C:\MyService\MyService.exe

操作步驟,類似安裝服務的步驟,略。

 

方法二:bat文件方式:

原理就是方法一,只是把安裝和卸載服務的命令放到installWS.bat和unstallWS.bat中。而且為了減少用戶自己寫腳本,可以開發一個工具CreateWSSetup.exe負責生成制定Window服務的安裝和卸載腳本bat文件。

 

方法三:將服務程序打包成安裝包

注意:這里我會新建一個安裝項目MyServiceSetup和Console項目CreateWSSetup,其中CreateWSSetup的功能主要是根據MyService.exe生成服務的安裝腳本和卸載腳本,並且根據傳入參數intall執行安裝和啟動服務,unstall執行停止和卸載服務。

實現原理,選擇安裝項目,添加項目輸出MyService、添加視圖中的行為:

安裝:添加項目輸出CreateWSSetup.exe,參數為install。

卸載:添加項目輸出CreateWSSetup.exe,參數為unstall。

步驟1:添加項目輸出,添加MyServie和CreateWSSetup項目輸出。

clip_image026

步驟2:添加操作行為: 添加安裝和卸載的操作行為

clip_image028

添加安裝的自定義行為:選擇項目輸出CreateWSSetup,設置參數install.

clip_image030

接着設置“安裝”的屬性:Arguments(install,這個是自己定義,根據你寫的執行程序而定)和InstallClass(選否,是因為CreateWSSetup.cs不是一個InstallClass)。

clip_image032

添加卸載的自定義行為:選擇項目輸出CreateWSSetup,設置參數unstall。操作畫面和安裝的自定義行為相同,這里就不截圖了。

步驟3:選中安裝項目MyServiceSetup,執行“重新生成”,即可在Bin\Debug下面得到Window服務MyService的安裝和卸載的程序包。

 

四、 Window 服務如何調試

 

首先安裝好服務,然后剩下的事情就和普通程序調試一樣了。

注意安裝的路徑,應該是程序所在的Bin\Debug\下的服務程序exe文件。

 

五、 Window 服務的使用價值

 

1、 建立定時執行的工作任務。

2、 建立服務器監控程序。

3、 公共的應用程序訪問接口。

4、 其他用途。

 

六、 Window服務使用演習

 

clip_image034

MyService服務定時彈出的程序,你也可以自己寫一個Form1.exe程序放到服務中。比如查詢服務器上的已有服務。或者重啟數據庫或IIS等等。

clip_image036

 

其他:

1、安裝服務:
方法1: (可以安裝多個服務實例)
sc create "MyService_PRD" binPath= "H:\Program Files\MyServiceSetup\MyService"
sc start "MyService_PRD"
 ---- 產生服務1: MyService_PRD
--
sc create "MyService_DEV" binPath= "H:\Program Files\MyServiceSetup\MyService"
sc start "MyService_DEV"
 ---- 產生服務2: MyService_DEV
 
方法2: (不能安裝多個服務實例)
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe "H:\Program Files\MyServiceSetup\MyService.exe"
sc start "MyService"

2、卸載服務 
方法1:
sc delete  "MyService_PRD"

方法2:
sc stop  "MyService"
%systemroot%\microsoft.net\framework\v2.0.50727\installUtil.exe /u "H:\Program Files\MyServiceSetup\MyService.exe"

 

后記:

改項目已經在Window XP\Window Server 2003中,驗證了安裝包的正確運行無誤。但是在Window Server 2008中,系統會彈出系統警告窗口“服務已經支持與桌面交互,但是系統沒有配置允許:服務允許和桌面進行交互”,如果朋友有知道解決辦法的不妨告訴我。多謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM