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、服務正常運行時,程序重新編譯會失敗,必須停止服務才能編譯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章