共用方式為


Windows 服務應用程式簡介

備註

本文不適用於 .NET 中的託管服務。 如需使用 Microsoft.Extensions.Hosting.BackgroundService 和 Worker Service 範本之 Windows 服務的最新內容,請參閱:

Microsoft Windows 服務,先前稱為 NT 服務,允許您建立可在各自的 Windows 會話中長時間運行的可執行應用程式。 這些服務可以在電腦開機時自動啟動、可以暫停和重新啟動,而且不會顯示任何使用者介面。 這些功能讓服務非常適合在伺服器上使用,或每當您需要長時間執行的功能時,不會干擾在相同計算機上工作的其他使用者。 您也可以在與登入使用者或預設電腦帳戶不同的特定用戶帳戶的安全性內容中執行服務。 如需服務和 Windows 會話的詳細資訊,請參閱 Windows SDK 檔。

您可以藉由建立安裝為服務的應用程式,輕鬆地建立服務。 例如,假設您想要監視性能計數器數據,並回應臨界值。 您可以撰寫 Windows 服務應用程式來接聽性能計數器數據、部署應用程式,並開始收集和分析數據。

您會將服務建立為Microsoft Visual Studio 專案,並在其中定義程序代碼,以控制哪些命令可以傳送至服務,以及在收到這些命令時應該採取哪些動作。 可以傳送至服務的命令包括啟動、暫停、繼續和停止服務;您也可以執行自訂命令。

建立並建置應用程式之後,您可以執行命令行公用程式 InstallUtil.exe 並傳遞路徑至服務的可執行檔來安裝應用程式。 然後,您可以使用 服務控制管理員 來啟動、停止、暫停、繼續及設定服務。 您也可以在 [伺服器總管] 中的 [服務] 節點或使用 ServiceController 類別來完成上述許多相同的工作。

服務應用程式與其他 Visual Studio 應用程式

服務應用程式以數種方式與其他許多項目類型不同:

  • 服務應用程式專案所建立的已編譯可執行檔必須安裝在伺服器上,專案才能以有意義的方式運作。 您無法按 F5 或 F11 來偵錯或執行服務應用程式;您無法立即執行服務或逐步執行其程式代碼。 相反地,您必須安裝並啟動服務,然後將調試程式附加至服務的處理程式。 如需詳細資訊,請參閱 如何:偵錯 Windows 服務應用程式

  • 不同於某些類型的專案,您必須為服務應用程式建立安裝元件。 安裝元件會在伺服器上安裝並註冊服務,並同時使用 Windows 服務控制管理員為您的服務建立項目。 如需詳細資訊,請參閱 如何:將安裝程式新增至您的服務應用程式

  • Main服務應用程式的方法必須針對專案所包含的服務發出 Run 命令。 方法 Run 會將服務載入到適當伺服器上的 服務控制管理員 。 如果您使用 Windows 服務 項目範本,則會自動為您撰寫此方法。 請注意,載入服務與啟動服務不同。 如需詳細資訊,請參閱下方的「服務壽命」部分。

  • Windows 服務應用程式會在與登入使用者互動式工作站不同的視窗工作站中執行。 視窗工作站是一個安全物件,其中包含剪貼簿、一組全域變元,以及一系列桌面物件。 因為 Windows 服務的月臺不是互動式月臺,因此不會看到從 Windows 服務應用程式內引發的對話方塊,而且可能會導致程式停止回應。 同樣地,錯誤訊息應該記錄在 Windows 事件記錄檔中,而不是在使用者介面中引發。

    .NET Framework 支援的 Windows 服務類別不支援與互動式月臺的互動,也就是登入的使用者。 .NET Framework 也不包含代表月臺和桌面的類別。 如果您的 Windows 服務必須與其他站台互動,您必須存取非受控 Windows API。 如需詳細資訊,請參閱 Windows SDK 檔。

    Windows 服務與使用者或其他工作站的互動必須仔細設計,以涵蓋沒有使用者登入的情況,或使用者有一組意外的桌面對象。 在某些情況下,撰寫在使用者控制下執行的 Windows 應用程式可能更合適。

  • Windows 服務應用程式會在自己的安全性內容中執行,並在使用者登入安裝所在的 Windows 電腦之前啟動。 您應該仔細規劃要在哪個用戶帳戶內執行服務;在系統帳戶下執行的服務具有比用戶帳戶更多的許可權和許可權。

服務存留期

服務會在其存留期內經歷數個內部狀態。 首先,服務會安裝到將執行它的系統上。 此程式會執行服務專案的安裝程式,並將服務載入該計算機的 Services Control Manager服務控制管理員是 Windows 提供以管理服務的中央公用程式。

載入服務之後,必須啟動服務。 啟動服務可讓它開始運作。 您可以從 服務控制管理員伺服器總管或從程式代碼呼叫 Start 方法啟動服務。 方法會將 Start 處理傳遞至應用程式的 OnStart 方法,並處理您已在那裡定義的任何程式碼。

執行中的服務可以無限期存在此狀態,直到它停止或暫停,或直到電腦關閉為止。 服務可以存在於三種基本狀態之一: RunningPausedStopped。 服務也可以報告暫止命令的狀態: ContinuePendingPausePendingStartPendingStopPending。 這些狀態表示已發出命令,例如暫停執行中服務的命令,但尚未執行。 您可以查詢 Status 來判斷服務處於何種狀態,或使用 WaitForStatus 在發生上述任何狀態時執行動作。

您可以從 服務控制管理員伺服器瀏覽器,或藉由在程式代碼中呼叫方法,暫停、停止或繼續服務。 每個動作都可以在服務 (OnStop、 或OnPause) 中呼叫相關聯的程式,OnContinue您可以在其中定義服務變更狀態時要執行的其他處理。

服務類型

您可以使用 .NET Framework 在 Visual Studio 中建立兩種類型的服務。 程式中唯一服務的服務會指派類型 Win32OwnProcess。 與另一個服務共享進程的服務會獲指派類型 Win32ShareProcess。 您可以藉由查詢ServiceType屬性來擷取服務類型。

如果您查詢未在 Visual Studio 中建立的現有服務,您可能會偶爾會看到其他服務類型。 如需這些的詳細資訊,請參閱 ServiceType

服務和 ServiceController 元件

元件 ServiceController 可用來連線到已安裝的服務並管理其狀態,使用 ServiceController 元件,您可以啟動和停止服務、暫停並繼續其運作,以及傳送自訂命令至服務。 不過,當您建立服務應用程式時,不需要使用 ServiceController 元件。 事實上,在大部分情況下,您的 ServiceController 元件應該存在於與定義您服務的 Windows 服務應用程式不同的應用程式中。

如需詳細資訊,請參閱ServiceController

需求

  • 服務必須在 Windows 服務 應用程式專案或其他啟用 .NET Framework 的專案中建立,以在建置和繼承自 ServiceBase 類別時建立 .exe 檔案。

  • 包含 Windows 服務的項目必須具有專案及其服務的安裝元件。 這可以從 [ 屬性 ] 視窗輕鬆完成。 如需詳細資訊,請參閱 如何:將安裝程式新增至您的服務應用程式

另請參閱