在 C# 中建立 Windows 服務相當直觀,所有相關類別都位於 System.ServiceProcess 命名空間下。每個服務都必須繼承 ServiceBase 類別,並覆寫啟動、暫停、停止等核心方法。Windows 服務的相關資訊存儲在登錄表中,因此它可以在使用者未登入的情況下自動運行。C# 提供了 ServiceProcessInstaller 和 ServiceInstaller 兩個安裝類別,讓開發者無需手動操作登錄表即可完成服務安裝。
首先在 Visual Studio 中建立一個「Windows 服務」專案:

專案建立成功後,預設會包含 Program.cs 和 Service1.cs 兩個核心檔案:

Program.cs 只包含服務運行的相關資訊,支援在單一進程中運行多個服務實例:
/// <summary>
/// 應用程式的主進入點。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new Service1() // 這裡是一個陣列,意味著我們可以在一個服務進程中建立多個服務實例
};
ServiceBase.Run(ServicesToRun);
}
Service1.cs 是我們需要實作的服務類別,包含 Start、Stop、Pause、Continue 等基本操作。這裡示範在服務啟動和停止時,分別記錄一條訊息到 D 槽:
protected override void OnStart(string[] args)
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服務啟動"));
}
protected override void OnStop()
{
File.AppendAllText("d:" + this.GetType().Name + ".txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss 服務停止"));
}
雙擊專案中的 Service.cs 進入服務設計介面,在空白處右鍵選擇「加入安裝程式」:

VS 會自動建立 ProjectInstaller.cs 並切換到設計介面,預設包含兩個元件:
serviceProcessInstaller1:設定服務所屬帳戶,關係到服務的執行權限serviceInstaller1:服務資訊描述,如服務名稱、是否自動啟動等設定 serviceProcessInstaller1 的 Account 屬性為 LocalSystem:

設定 serviceInstaller1 的 StartType 為 Automatic(自動啟動),Description 為「我的第一個 Windows 服務」:

建置專案後,找到產生的執行檔。因為 Windows 服務無法透過雙擊直接執行,必須使用 .NET 提供的 InstallUtil.exe 來安裝:

按 Enter 開始安裝,成功會提示「認可階段已成功完成」,失敗則顯示「回復階段已成功完成」:

打開 Windows 服務管理器即可看到安裝的服務,預設安裝成功後不會立即啟動,需手動啟動:

啟動成功後狀態顯示為「已啟動」:

到 D 槽根目錄下找到 Service1.txt,開啟即可看到記錄的啟動/停止資訊,證明服務運作正常。
若需解除安裝,可使用以下兩種方式之一:
InstallUtil.exe /u WindowsService1.exesc delete 服務名稱