C#開發windows服務如何調試——資料整理


 

原文標題:C# Windows服務程序如何進行調試

原文地址:https://jingyan.baidu.com/article/456c463b18e1b00a583144b3.html

第一種:

附加到進程

1,首先要對服務進行安裝,然后啟動服務,如下圖所示:

 

 2,打開VS項目,選擇菜單 調試->附加到進程 選項,如下圖所示:

 

 

3,選擇服務進程(如果找不到可以勾選 顯示所有用戶進程 選項)就可以了,找到服務對應的exe程序,如下圖所示:

 

 4,在附加到進程的同時 OnStart 函數已經執行完畢,所以對 Onstart 無法調試。這個可以通過設置啟動服務延時來加載調試,只需要在計時器Timer初始化的時候,傳遞一個參數即可,如下圖所示:

 

 

5,

注意:正常服務的啟動時間為30秒左右,當服務啟動時間超過30秒會報錯!

 所以不要在OnStart中做過多的操作,也可以用這種延時的方法啟動服務,以防在啟動服務時超時。

 

第二種:

修改源代碼(推薦)

找到服務主類中的OnStart方法,由

protected override void OnStart(string[] args)

{

  //todo something

}

修改成

public void OnStart()

{

   //todo something

}

如下圖所示:

 

 

注釋掉Program.cs文件中的如下代碼:

ServiceBase[] ServicesToRun;

ServicesToRun = new ServiceBase[] 

{ 

new Service1() 

};

ServiceBase.Run(ServicesToRun);

//修改成

Service1 s1 = new Service1();

s1.OnStart();

//如下圖所示:

 

 在OnStart方法中利用F9打斷點,然后按下F5就可以進行調試跟蹤代碼了,如下圖所示:

 

 注意:調試時,需要將先前啟動的服務首先停止。程序代碼編寫調試完成后,記得將第1和2步驟的修改還原即可。

 

 

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

其他參考文章:

文章:Windows服務二:測試新建的服務、調試Windows服務

內容記錄日志的地方很有借鑒意義。

 

文章:https://www.cnblogs.com/dotnet261010/p/6179480.html

文章標題:Windows服務一:新建Windows服務、安裝、卸載服務

文章很好的介紹了如何新建和安裝服務,當然還有卸載。

安裝部分很有借鑒意義,提供了多種方法。

 

 微軟資料:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-debug-windows-service-applications

路徑:

標題:如何:調試 Windows 服務應用程序

 

文章:C# windows服務的創建與調試

比較全面簡潔。

 

文章:c#寫windows服務

示例代碼很好,不過具體細節不詳細應該都能看懂。

作者的文章有很多贊同。

 

文章:調試windows服務最簡單的方法之一

很好用的方法。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsService1
{
    static class Program
    {
        /// <summary>
        /// 應用程序的主入口點。
        /// </summary>
        static void Main()
        {
            Service1 s = new Service1();

            if (Environment.UserInteractive)
            {
                s.DebugStart();

                Console.ReadKey();

                s.DebugStop();
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] { s };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }
}

關鍵就在對Environment.UserInteractive的判斷上,

請看MSDN上面的解釋:

獲取一個值,用以指示當前進程是否在用戶交互模式中運行。

UserInteractive 屬性為運行時無用戶界面的 Windows 進程或一個服務(如 IIS)報告 false。 如果此屬性為 false,請不要顯示模式對話框或消息框,因為沒有用來與用戶進行交互的圖形用戶界面。

http://msdn.microsoft.com/zh-cn/library/system.environment.userinteractive(v=VS.100).aspx

然后看一下Service1.cs中的代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            this.ServiceStart();
        }

        protected override void OnStop()
        {
            this.ServiceStop();
        }

        internal void DebugStart()
        {
            this.ServiceStart();
        }

        internal void DebugStop()
        {
            this.ServiceStop();
        }

        private void ServiceStart()
        {
            // TODO:

        }

        private void ServiceStop()
        {
            // TODO:
        }



    }
}

最后:更改Project的輸出類型

右擊該Project,點擊Properties,在Application標簽中,更改Output Type為Console Application。

OK啦,按F5試試

 

大佬果然是大佬啊,學習了。

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM