1. 程式人生 > 實用技巧 >Windows Service開發介紹

Windows Service開發介紹

建立服務

1、選擇新建->專案->Windows桌面,選擇Windows服務。

2、輸入名稱,單擊"確定"。
注意事項:如果在模板中沒有Windws服務,可能是未安裝.NET桌面開發,可以通過選擇左下角開啟Visual Studio選擇安裝程式,選擇.NET桌面開發安裝。

重新命名服務

1、服務建立好,預設名稱是Service1.cs,根本實際業務改為匹配的名稱,修改名稱過程中,會提示"即將重新命名檔案。是否也對此專案中對程式碼元素“Service1”的所有引用執行重新命名操作?",點選"是"。

2、雙擊服務,在"設計"檢視中,右擊"屬性",在屬性視窗中把ServiceName的值更改為剛才修改的名字。

編寫業務

在"設計"檢視中,點選"切換到程式碼檢視",可以看到,此類繼承了ServiceBase
程式碼預設重寫有OnStart和OnStop兩個方法,用於啟動和停止服務對元件的處理。

        /// <summary>
        /// 啟動
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            Log4netHelper.Info("Demo Service啟動");
            // TODO 業務處理
        }

        /// <summary>
        /// 停止
        /// </summary>
        protected override void OnStop()
        {
            Log4netHelper.Info("Demo Service停止");
        }

還可以重寫 OnPause、OnContinue 和 OnShutdown 方法來定義對元件的其他處理。
支援通過EventLog寫入事件日誌,需要在"serviceProcessInstaller1"中的Account設定為LocalSystem。
注意事項:不推薦使用此帳戶,因為許可權過大,推薦使用LocalSerice帳戶。

輪詢

通過Timer元件來實現此功能。
示例:

        /// <summary>
        /// 啟動
        /// </summary>
        /// <param name="args"></param>
        protected override void OnStart(string[] args)
        {
            Log4netHelper.Info("Demo Service啟動");
            Timer timer = new Timer();
            timer.Interval = 60000; // 60 秒
            timer.Elapsed += new ElapsedEventHandler(this.OnTimer);
            timer.Start();
        }

        /// <summary>
        /// 定時器事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        public void OnTimer(object sender, ElapsedEventArgs args)
        {
            // TODO 業務處理
            Log4netHelper.Info("Timer執行");
        }

新增安裝程式

1、新增安裝程式

雙擊服務名稱,在"設計"檢視中右擊,選擇新增安裝程式。

Visual Studio會向專案中新增一個名為ProjectInstaller元件,其中會包含兩個安裝程式。

2、配置安裝程式

在ProjectInstaller的"設計"檢視中,選擇"serviceProcessInstaller1",右擊選擇屬性,配置引數:

  1. Account設定為LocalService。

在ProjectInstaller的"設計"檢視中,選擇"serviceInstaller1",右擊選擇屬性,配置引數:

  1. Account設定為LocalService。
  2. Description設定服務描述,此描述在"服務"視窗描述列顯示。
  3. DisplayName設定為Demo服務,此名稱可以不同於ServiceName屬性,它是系統使用的名稱,此名稱在"服務"視窗名稱列顯示。
  4. ServiceName設定為DemoService,和服務類名稱保持一致。
  5. StartType設定為Automatic,自啟動。

3、新增自啟動程式

  在StartType設定為Automatic,並不能達到程式安裝後啟動,需要在`ProjectInstaller.cs`中增加程式碼。
       /// <summary>
        /// Ctor
        /// </summary>
        public ProjectInstaller()
        {
            InitializeComponent();
            // 安裝後自啟動
            this.Committed += new InstallEventHandler(ProjectInstaller_Committed);
        }

        /// <summary>
        /// 安裝後發生事件,啟動服務
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ProjectInstaller_Committed(object sender, InstallEventArgs e)
        {
            System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("DemoService");
            controller.Start();
        }

注意事項:ServiceController建構函式接收向系統標識該服務的名稱, 也可以是服務的顯示名稱。

安裝服務

使用InstallUtil.exe安裝,啟用Cmd或Windows PowerShell輸入安裝命令。
注意事項:Cmd或Windows PowerShell必須使用管理員模式開啟。

1、安裝

  1. 32位.NET Framework4或4.5以及更高版本。
    安裝:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe 檔案所在完整路徑\DemoService.exe
    

    解除安裝:

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u 檔案所在完整路徑\DemoService.exe
    
  2. 64位.NET Framework4或4.5以及更高版本。
    安裝:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe 檔案所在完整路徑\DemoService.exe
    

    解除安裝:

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /u 檔案所在完整路徑\DemoService.exe
    

2、效果

除錯

由於服務的特殊性,無法直接啟動除錯,可以通過附加進行的方式進行調整。

1、附加程序

通過Visual Studio"除錯"選擇"附加到程序"。

2、選擇服務程序

在程序中找到對應的服務。

3、效果


注意事項:
1、附加程序除錯,Visual Studio必須以管理員許可權開啟。
2、如果在附加程序中看不到服務,確認"顯示所有使用者的程序"是否已勾選。
3、服務正常執行時,程式重新編譯會失敗,必須停止服務才能編譯。