撰寫 Windows Service程式時除錯的技巧.

撰寫 Windows Service程式時除錯的技巧.

相信很多人都有經驗在撰寫Windows Service常會遇到除錯不易的問題.
因為一個標準的 Windows Service若要除錯必須先停用服務,重新將新程式覆蓋舊有程式,然後透過VS IDE的Attach to Process功能才能進行單步追蹤.

 

而最好的偵錯是透過Unit Test來處理,不過大多數在台灣的公司因為環境問題很少見會如此進行.

故這邊介紹一個相當簡易的方式來處理這個問題,不需要調整太多程式碼即可達成.

步驟一.

開啟或建立一個Windows Service應用程式專案.

 

步驟二.

新增一個Class,命名為MyService (名稱自己決定就好)

 

步驟三

在MyService新增方法Start() Stop() Pause()等相關方法.

 

步驟四

將原來撰寫在Windows Service中的OnStart() OnStop()與OnPause()等相關程式碼都移轉到上述相關方法中.

 

到此大致上都完成移轉程序.

其實觀念很簡單,在.Net專案中最接近Windows Service專案的專案型態是Console Mode Application.而Console Mode Application也是最容易除錯的專案型態.

所以如果把Windows Service專案能夠變成Console Mode Application型式那就可以很簡單的在除錯時使用一般的方式除錯,而在部屬時直接使用Windows Service專案型式輸出.

到此我想很多人應該後面知道該如何進行了,不清楚的也沒關係,繼續往下看.

 

步驟5.

在原來的Solution中新增一個 ConsoleMode應用程式.於ConsoleMode應用程式中使用專案參考方式參考Windows Service專案.

image

步驟6.

於ConsoleMode應用程式中的 Program.cs中撰寫如下程式

    class Program

    {

        static void Main(string[] args)

        {

            WindowsService1.MyService service = new WindowsService1.MyService();

            service.Start();

 

            Console.Read();

 

            service.Stop();

        }

    }

 

步驟7.

修改Service服務的程式如下.

    public partial class Service1 : ServiceBase

    {

        MyService service = new MyService();

        public Service1()

        {

            InitializeComponent();

        }

 

        protected override void OnStart(string[] args)

        {

            service.Start();

        }

 

        protected override void OnStop()

        {

            service.Stop();

        }

    }

 

最後只要將Console Application設定為起始專案即可偵錯.部屬時就使用原Windows Service專案輸出檔案即可.

此外如果能將相關原在Windows Service的程式碼獨立到另一個組件(assmebly)外會更好.