天天看點

C# VS 2010 建立、安裝、調試 windows服務(windows service)

在一個應用程式中建立多個 windows 服務的方法和 1083 錯誤的解決方法法

添加‘服務安裝成功’後自啟動功能

--------------------------------------------------------------------------------------

1.建立 windows服務 項目

  檔案 -> 建立項目 -> 已安裝的模闆 -> Visual C# -> windows ,在右側視窗選擇"windows 服務"

2.系統已經為我們建立了一個 Service1.cs 元件,測試時我們就用它了.

 如果要新件的話,右鍵項目 -> 添加 -> 建立項 -> windows 服務。

3.在 Service1.cs 上 ,按 F7 (右鍵檢視代碼),打開代碼頁。加入我們測試用的代碼。

  注意:下面的幾個方法中的 str 變量,為了我們一會兒調試時設定斷點用的!

using System;
  using System.Diagnostics;
  using System.ServiceProcess; namespace WindowsService1
  {
   public partial class Service1 : ServiceBase
   {
    public Service1()
    {
     InitializeComponent();
     InitService();
    }   /// <summary>
    /// 初始化服務參數
    /// </summary>
    private void InitService()
    {
     base.AutoLog = false;
     base.CanShutdown = true;
     base.CanStop = true;
     base.CanPauseAndContinue = true;
     base.ServiceName = "Service1";  //這個名字很重要,設定不一緻會産生 1083 錯誤哦!
    }
    protected override void OnStart(string[] args)
    {
     string str ="服務開啟";
    }   protected override void OnStop()
    {
     string str ="服務停止";
    }
    protected override void OnContinue()
    {
     string str ="服務繼續運作";
     base.OnContinue();
    }
    protected override void OnPause()
    {
     string str ="服務暫停";
     base.OnPause();
    }
   }
  }      

4.建立服務的“安裝程式”

4.1 輕按兩下”Service1.cs“,打開 Service1.cs 的視圖設計器

4.2 在視圖設計器中任意位置右鍵,選擇”添加安裝程式“ 

4.3 這時項目跟目下将出現一個 ProjectInstaller.cs 的元件

    (如果是第一次添加”安裝程式“的話)

4.4 輕按兩下 ProjectInstaller.cs 打開 ProjectInstaller  的視圖設計器

4.5 找到 serviceInstaller1 元件,選中後按 F4 鍵,設定元件屬性。

  Description=“測試服務1”;

  DisplayName=“Service1”;

  ServiceName=“Service1”;//這個值必須和 WindowsService1.InitService() 方法下設定的 base.ServiceName 屬性一至。

  StartType 為服務運作類型,根據你的需要設定即可。(Manual:手動啟動,AutoMatic 為自動啟動)

4.6 找到 serviceProcessInstaller1 元件,選中後按 F4 鍵,設定元件屬性。

  Account=“LocalSystem”; //設定為其他的屬性在開啟服務時,會提示輸入使用者名和密碼

4.7 這樣就完成了一個服務的所有準備,下面就是安裝和測試工作。

5.生成元件

 右鍵項目,選擇“生成”。

6.安裝元件

6.1 使用 InstallUtil.exe 工具注冊元件服務,檔案位置在不同版本的 framework 中。我用的是 4.0 是以在一下位置

 C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe

6.2 打開生成目錄,如果生成成功會有一個 WindowsService1.exe 檔案

6.3 在生成目錄根目錄下新加兩個 bat(批處理檔案),用于安裝和解除安裝服務

  建立一個文本檔案,打開檔案加入以下兩行指令

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WindowsService1.exe

  pause

  儲存後關閉文本檔案,之後将其重命名為“安裝服務.bat”檔案,注意要修改字尾名為 .bat!

  再建立一個文本檔案,打開檔案加入以下兩行指令

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe /u WindowsService1.exe

  pause

  儲存後關閉文本檔案,之後将其重命名為“解除安裝服務.bat”檔案,注意要修改字尾名為 .bat!

6.4 “安裝服務.bat”檔案,安裝windows 服務

7.安裝成功後需要手動開啟服務,因為我們剛設定 serviceInstaller1.StartType 為 Manual

 打開windows 服務管理器,找到名為 Service1 的服務,右鍵屬性。點選【啟動】按鈕

8.windows 調試

8.1 回到開發環境,選擇調試->附加到程序,勾選”顯示所有使用者程序“

8.2 找到 WindowsService1.exe 程序(如果沒有點選下重新整理按鈕),選中後點選“附加到程序”按鈕。

8.3 選中 Service1.cs 檔案,後按 F7 打開代碼視圖

8.4 在所有 str 變量上添加調試斷點

8.5 回到windows服務管理器,找 Service1 服務并選中它,在左側有一個“暫停”按鈕。點選一下

  這時,OnPause 方法下的斷點命中!OK 達到了調試的目的了

9.如果想一次安裝多個服務,需要按照 2~5 的步驟多添加幾個服務就好了!

--------------------------------------------------------------------------------------

問題及解決方案

注冊成功後,啟動 Windows服務 時遇到錯誤:1083 的解決辦法

1.檢視 Main() 方法中是否啟動了指定的服務

 ServiceBase[] ServicesToRun;

 ServicesToRun = new ServiceBase[]

 {

  new Service1(),

  new Service2() //如果建立多個服務需要添加這段代碼

 };

 ServiceBase.Run(ServicesToRun);

2.確定 ProjectInstaller.cs 視圖設計器中的 serviceInstaller1 元件的 ServiceName 屬性

  與 Service1.cs 元件的 ServiceName 屬性一緻

-----------------------------------------------------------------------------------------

添加服務安裝成功後自啟動功能

1.打開 ProjectInstaller.cs 視圖設計器,選中  serviceInstaller1 元件

2.打開 serviceInstaller1 元件的事件視窗,輕按兩下 AfterInstall 事件

3.在 serviceInstaller1_AfterInstall 事件方法下添加如下代碼

      System.ServiceProcess.ServiceController sc = new System.ServiceProcess.ServiceController();

      sc.ServiceName = "ExpressDispatchingTrack"; //必須與 ProjectInstaller.cs 視圖設計器中的 serviceInstaller1 元件的 ServiceName 屬性

一緻

      sc.Start();