受到園友麒麟的文章啟發,我研究了一下自訂調試視窗的相關技術,發現很簡單,但對調試效率的提高協助卻很大,以前對於複雜資料的調試顯示很抓狂,要麼不能顯示(只顯示一個Type資訊),要麼一層層的點開來看,很是不爽,如果能自訂調試視窗,按我們希望的方式顯示資料該多好啊,下面我來詳細介紹一下實現方式。
Step1:建立一個Console Application,添加對Microsoft.VisualStudio.DebuggerVisualizers的引用。
Step2:建立一個類,這個類是我們希望它在調試的時候顯示自訂調試視窗資訊的,以My Code為例,建立類MyTable備用。
Step3:建立類MyTableDebuggerVisualizer,該類繼承實現DialogDebuggerVisualizer,該抽象類別在命名空間Microsoft.VisualStudio.DebuggerVisualizers下,該抽象類別只有一個供使用者實現的Show方法,該方法的兩個參數分別是IDialogVisualizerService和IVisualizerObjectProvider,前者是用來控制顯示Visualizer(表單等)的,後者是提供調試資料的,另外還提供了替換、傳送資料等方法。
Step4:建立WinForm視窗MyTableDebuggerViewForm,該視窗將用來展示調試資料。MyTableDebuggerVisualizer只是一個存取點,要顯示自己的調試視窗只需要使用IDialogVisualizerService提供的ShowDialog方法顯示MyTableDebuggerViewForm即可,當然同時把要調試的資料傳入。
1: using Microsoft.VisualStudio.DebuggerVisualizers;
2:
3: namespace CustomDebugger
4: {
5: public class MyTableDebuggerVisualizer : DialogDebuggerVisualizer
6: {
7: protected override void Show(IDialogVisualizerService windowService,
8: IVisualizerObjectProvider objectProvider)
9: {
10: // TODO: Get the object to display a visualizer for.
11: // Cast the result of objectProvider.GetObject()
12: // to the type of the object being visualized.
13: MyTable myTable = (MyTable)objectProvider.GetObject();
14: // TODO: Display your view of the object.
15: // Replace displayForm with your own custom Form or Control.
16: MyTableDebuggerViewForm displayForm = new MyTableDebuggerViewForm(myTable);
17: windowService.ShowDialog(displayForm);
18: }
19: }
20: }
Step5:把調試視窗資訊關聯到類MyTable上,使用System.Diagnostics下的DebuggerVisualizer Attribute為MyTable設定可視化組件。
1: [DebuggerVisualizer(typeof(MyTableDebuggerVisualizer))]
2: [Serializable]
3: public class MyTable
4: {
5: }
注意MyTable頭上的Serializable Attribute,在進行自訂調試視窗的時候要求該類必須是可序列化的,所以我加上了Serializable,我猜測這應該是必須的,因為從IVisualizerObjectProvider提供的方法中我們發現,除了有GetObject之外還有GetData,而GetData返回的是Stream,這就要求被調試的對象必須是可序列化的。
為了可以看到效果,我們先在MyTableDebuggerViewForm裡加上一些顯示代碼
1: public partial class MyTableDebuggerViewForm : Form
2: {
3: public MyTableDebuggerViewForm(MyTable myTable)
4: {
5: this.Table = myTable;
6: InitializeComponent();
7: }
8:
9: public MyTable Table { get; private set; }
10:
11: private void MyTableDebuggerViewForm_Load(object sender, EventArgs e)
12: {
13: this.Text = this.Table.ToString();
14: }
15: }
到這就可以調試了,在Main函數裡隨便定義一個MyTable然後打個斷點,然後調試。
看到那個小放大鏡了嗎?猛擊它
我們自訂的視窗顯示了出來,並且標題是MyTable的類型名,是不是很簡單。最後就是根據自己的需要顯示被調試的資料就可以了,文章結尾我會提供一個完整的例子供大家參考。最後還有很重要的一點要說明,關於調試。
調試“調試視窗”(有點饒口)其實跟調試控制項的設計器或者調試Visual Studio外掛程式是類似的,有過控制項設計器開發經驗的朋友應該已經想到如何調試了,這裡跟還不清楚如何調試的朋友簡單說明一下:
在工程的屬性頁面裡找到Debug設定,設定工程的Start Action為Start external program,選擇Visual Studio的exe檔案devenv.exe,儲存設定。然後在MyTableDebuggerViewForm的MyTableDebuggerViewForm_Load方法下打好斷點,啟動調試,這時會開啟一個新的Visual Studio,然後在新的IDE中開啟同樣的項目,與調試控制項設計器略有不同的是,這時要在新的IDE中把工程的調試選項改回Start project(否則再調試就又開一個IDE),然後在新的IDE中打好斷點(打在MyTable處),調試MyTable,當開啟自訂的調試視窗時,第一個IDE的斷點就被命中了。
最後給大家分享一下完整的調試視窗:)
是不是跟DataTable的調試視窗很像?希望本文對您有協助。
完整代碼下載