原文標題: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服務
示例代碼很好,不過具體細節不詳細應該都能看懂。
作者的文章有很多贊同。
很好用的方法。
代碼示例:
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試試
大佬果然是大佬啊,學習了。