Windows服務除錯小結(附Demo)

sinodzh發表於2014-12-04

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

閱讀目錄

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

 

介紹

  有時候不可避免的要建些Windows服務。既然寫程式碼,就需要除錯,由於這個東西搞的人不多,每個人除錯的方法也不全,所以在下在這裡小結一下除錯方法。

搭建環境

一:建立一個Window Service

  檔案->新建專案->Windows 服務。

  然後我們直接執行試試,然後提示如下:

  好吧,我們就依他的意思,加個服務安裝程式和些相關的引用及其他,結果如下:

  

  這樣我們的環境就基本搭建好了,然後就是服務的安裝,執行bin\Debug\Install\install.bat即可。

除錯方式

一:普通除錯

  msdn上指出“必須從服務控制管理器的上下文中而不是 Visual Studio 中執行服務。 因此,除錯服務不像除錯其他 Visual Studio 應用程式型別一樣簡單。 要除錯服務,必須啟動該服務,然後將偵錯程式附加到該服務正在其中執行的程式中。 然後你可以使用所有 Visual Studio 的標準除錯功能來除錯你的應用程式”。

  所以我們啟動服務,然後通過vs附件該服務程式,然後就可以除錯了。如下:

 

二:特殊除錯

  如果我們不想建立服務就想除錯程式碼,其實可以採用其他的替代方式進行,只不過要改程式碼。

  我們找到程式的入口:Program.cs。

  原始碼如下:

 1     static class Program
 2     {
 3         /// <summary>
 4         /// 應用程式的主入口點。
 5         /// </summary>
 6         static void Main()
 7         {
 8             ServiceBase[] ServicesToRun;
 9             ServicesToRun = new ServiceBase[] 
10             { 
11                 new ServiceDebug() 
12             };
13             ServiceBase.Run(ServicesToRun);
14         }
15     }

  修改後程式碼如下:

 1         protected override void OnStart(string[] args)
 2         {
 3             Timer timer = new Timer();
 4             timer.Interval = 1000;
 5             timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
 6             timer.Start();
 7 
 8         }
 9 
10         private void timer_Elapsed(object sender, ElapsedEventArgs e)
11         {
12 
13         }
14 
15         protected override void OnStop()
16         {
17         }
18 
19         public void Test(string[] args)
20         {
21             OnStart(args);
22         }
 1     static class Program
 2     {
 3         /// <summary>
 4         /// 應用程式的主入口點。
 5         /// </summary>
 6         static void Main()
 7         {
 8             ServiceDebug service = new ServiceDebug();
 9             service.Test(null);
10 
11             while (true)
12             {
13                 System.Threading.Thread.Sleep(1000);
14             }
15             return;
16 
17             ServiceBase[] ServicesToRun;
18             ServicesToRun = new ServiceBase[] 
19             { 
20                 new ServiceDebug() 
21             };
22             ServiceBase.Run(ServicesToRun);
23         }
24     }

  這樣,我們就可以進行除錯了。

二:OnStart常規除錯

  有時候我們想正常的除錯Onstart方法,但是,啟動服務後這個方法已經執行了,那麼我們應該怎麼除錯捏。

  我們可以在Onstart方法體前面加個Debugger.Launch();就可以很愉快的除錯了。如下:

 1         protected override void OnStart(string[] args)
 2         {
 3             Debugger.Launch();
 4 
 5             Timer timer = new Timer();
 6             timer.Interval = 1000;
 7             timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
 8             timer.Start();
 9 
10         }

  啟動服務後彈出如下:,然後選中對應的解決方案即可。

 

Demo下載

原始碼下載

本文版權歸mephisto和部落格園共有,歡迎轉載,但須保留此段宣告,並給出原文連結,謝謝合作。

相關文章