自訂Visual Studio調試視窗

來源:互聯網
上載者:User

    受到園友麒麟的文章啟發,我研究了一下自訂調試視窗的相關技術,發現很簡單,但對調試效率的提高協助卻很大,以前對於複雜資料的調試顯示很抓狂,要麼不能顯示(只顯示一個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的調試視窗很像?希望本文對您有協助。

    完整代碼下載

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.