第一個 Windows Service

一、新建 Windows 服務專案

  1. 開啟 Visual Studio,建立新專案
  2. 範本選擇:Visual C# → Windows → Windows 服務
  3. 設定專案名稱、儲存路徑,點選確定

注意:新版 Visual Studio 已不再內建此範本,僅 .NET Framework 支援該範本;.NET Core/.NET 5+ 建議使用 Worker Service

二、專案結構說明

自動產生核心檔案:

  1. Program.cs:程式進入點
  2. Service1.cs:服務主要邏輯類別
1. Program.cs 進入點程式碼
static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[]
        {
            new Service1()
        };
        ServiceBase.Run(ServicesToRun);
    }
}Code language: JavaScript (javascript)

作用:啟動服務容器,載入一個或多個服務執行個體。

2. Service1.cs 服務主類別
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    // 【服務啟動時執行】
    protected override void OnStart(string[] args)
    {

    }

    // 【服務停止時執行】
    protected override void OnStop()
    {

    }
}
  • OnStart:服務啟動觸發,商業邏輯寫在此處
  • OnStop:服務停止觸發,用來釋放資源

三、新增安裝程式

此步驟為必要!否則無法註冊至系統服務。

操作步驟
  1. Service1 的設計檢視介面,右鍵 → 新增安裝程式
  2. Visual Studio 自動產生 ProjectInstaller.cs,包含兩個核心元件:
    • serviceInstaller1
    • serviceProcessInstaller1

元件屬性設定

  1. serviceInstaller1(服務資訊設定)
    • ServiceName:內部服務名稱(程式碼識別)
    • DisplayName:服務管理員顯示名稱
    • Description:服務描述
    • StartType:啟動類型 Manual(手動)/Automatic(自動)
  2. serviceProcessInstaller1(執行帳號設定)
    • Account:執行身分
    • LocalSystem:本機系統帳號(權限最高,建議測試使用)
    • User:指定 Windows 帳號(預設,需填寫帳號密碼)

四、撰寫測試商業邏輯

商業程式撰寫在 Service1 內,你可以將業務邏輯寫在此處。因為服務難以偵錯,我們暫時透過輸出日誌做驗證,服務需要安裝與解除安裝。

修改 Service1.cs

using System.IO;

protected override void OnStart(string[] args)
{
    // 啟動寫入日誌
    File.AppendAllText("log.txt", "啟動時間:" + DateTime.Now + Environment.NewLine);
}

protected override void OnStop()
{
    // 停止寫入日誌
    File.AppendAllText("log.txt", "停止時間:" + DateTime.Now + Environment.NewLine);
}Code language: JavaScript (javascript)

五、編譯、安裝、啟動服務

  1. 編譯專案,取得 WindowsServiceDemo.exe
  2. 使用 InstallUtil.exe 註冊服務(系統管理員 CMD)
# 安裝服務
InstallUtil.exe WindowsServiceDemo.exe

# 解除安裝服務
InstallUtil.exe /u WindowsServiceDemo.exeCode language: PHP (php)
  1. 開啟服務管理員 services.msc,找到對應服務,啟動/停止並檢視日誌。

服務無法像一般程式直接執行偵錯,必須透過工具完成安裝。

注意事項

  1. 無法直接按 F5 偵錯:Windows 服務不能直接啟動偵錯,建議實作雙模式;命令列執行做為主控台程式,安裝之後做為服務執行。
  2. 路徑問題:相對路徑會失效,優先使用絕對路徑。
  3. 權限問題:執行帳號決定磁碟、網路、共用資料夾的存取權限。
  4. 啟動逾時OnStart 長時間阻塞會被系統判定啟動失敗,耗時工作建議開新執行緒執行。

第一個 Windows Service

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *