如何編寫Windows服務

2022-01-10 11:00:26 字數 3126 閱讀 1025

按微軟的定義,服務是乙個長時間執行的可執行檔案,它不支援使用者介面,並執行在特殊的使用者賬戶之下,也可以在沒有任何使用者登入計算機的情況下執行。預設情況下,服務執行在system賬戶之下。與一般的應用程式相比,服務自動執行的,並且無需與使用者互動。

在.net framework中,與windows服務相關的類位於system.serviceprocess命名空間之下,其中,servicebase類提供windows服務的基類,我們編寫的服務必須從該類派生。

servicebase包含四個可被過載的方法:onstart、onstop、onpause以及oncontinue,顧名思義,這四個方法在服務啟動、停止、暫停以及繼續動作時被呼叫(對服務的控制可以通過控制面板中,管理工具下的服務控制管理器實現(或直接在執行裡面輸入services.msc))。

乙個承載服務的可執行檔案可以包含多個服務,每乙個服務對應乙個從servicebase派生的類。應注意,執行可執行檔案與啟動服務並不相同,執行可執行檔案時,將呼叫服務類的建構函式,完成成將呼叫服務的onstart方法。而啟動服務僅僅是呼叫服務的onstart方法。

通過服務控制管理器(services.msc)可以實現與服務的互動,相應的,在servicebase中提供兩個屬性用於向管理器表明服務支援的控制動作:canstop以及canpauseandcontinue,當設定為true時,在管理器中服務的停止、暫停和繼續選單可用,反之,則不可用。

另外,canshutdown使用者表明在系統關閉時,是否向服務傳送乙個通知。

與windows服務相關的另乙個重要類名為:serviceinstaller,該類用於安裝乙個服務。乙個servicebase應該對應乙個serviceinstaller。注意,服務的安裝是通過工具installutil來進行的,該工具將會呼叫服務可執行檔案中的install類,用於實現服務的安裝。

一般情況下,我們從install類中派生出我們自己的安裝類,然後在建構函式中例項化服務對應的serviceinstaller類(乙個或多個)以及乙個表示安裝程序的serviceprocessinstaller類(該類用於控制安裝程序,如指定執行安裝程序的賬戶)。在安裝類中,我們應該指定runinstallerattribute屬性,這樣installutil工具才能通過反射技術找出可執行檔案中存在的安裝類。

下面給出乙個簡單的服務,它每隔5秒鐘向應用程式事件記錄中寫入一條資訊(當前時間),通過該示例可了解服務的編寫及除錯方法:

1、新建乙個專案,名稱為testservice,專案型別為windows service

2、將服務**檔名稱修改為testservice

3、切換到testservice的**檢視,編寫**如下:

testservice.cs

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.diagnostics;

using

system.serviceprocess;

using

system.text;

using

system.threading;

namespace

testservice

protected

override

void onstart(string

args)

this.thread.isbackground = true

;

this

.thread.start();

}protected

override

void

onstop()}}

private

void

threadrun()}}

}

4、新建乙個類,檔名為testinstall.cs,**如下:

testinstall.cs

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.serviceprocess;

using

system.configuration.install;

using

system.componentmodel;

namespace

testservice

}}

5、編譯整個解決方案

6、通過installutil命令安裝服務:

1)、進入visual studio 2008命令提示

2)、切換當前路徑到專案路徑的debug目錄,如:

cd d:\others\develop\csharp\testservice\testservice\bin\debug

3)、安裝服務,命令:

installutil testservice.exe

4、啟動服務,開始 執行 輸入services.msc,我們將看到服務列表中已經存在我們的服務,名稱為.net test service

5、在名稱上單擊右鍵,啟動服務

6、如何除錯服務呢?確保服務啟動後,返回visual studio,選擇除錯選單中的attach to process命令,在彈出視窗中勾選show processes from all users,然後查詢我們的服務程序:testservice.exe,選擇它,然後點選attach按鈕。attach後,如果我們在threadrun過程中加入斷點,則下乙個迴圈到達後服務將會掛起,進入除錯狀態。

7、在本例中我們是不斷地向應用程式日記中寫入記錄,要檢視此結果可通過以下方式:啟動事件檢視器(開始 執行 輸入eventvwr.msc),選擇應用程式,在右方列表中會存在**為.net test service的記錄,它既是我們的服務程序寫入的。雙擊進入可看到事件描述(執行時得當前時間)

8、解除安裝服務,通過如下命令(先通過服務控制管理器停止服務):

installutil /u testservice.exe

如何編寫Windows服務

按微軟的定義,服務是乙個長時間執行的可執行檔案,它不支援使用者介面,並執行在特殊的使用者賬戶之下,也可以在沒有任何使用者登入計算機的情況下執行。預設情況下,服務執行在system賬戶之下。與一般的應用程式相比,服務自動執行的,並且無需與使用者互動。在.net framework中,與windows服...

如何編寫windows服務程式

如何編寫windows服務程式 原 by 張鵬 hikvision 這兩天想學習關於如何編寫windows服務程式的知識,就上網查了些資料。看了一篇文章 用c 語言編寫windows 服務程式的五個步驟 但可能由於譯者的疏忽,忘記了將關鍵 放入該文件,導致初學者可能會看不懂。所以又查閱了相關資料。自...

C 編寫Windows服務

使用c 編寫windows 服務,我所看的文章如下 紅色的 以內,來自 前一段時間我寫了一篇通過寫服務的形式來達到一些監視程式執行的目的的 文章 至於如何在windows 下寫服務我沒有詳細介紹,今天就讓 我們 一起看看如何來寫服務程式。windows 服務被 設計 用於需要在後台執行的應用程式以及...