-1

我看過很多關於相關的問題,但還是覺得很困惑如何在Visual Studio Extension中使用調試API?

我現在主要遇到的問題是無法獲得調試過程的當前狀態,比如何時遇到斷點。

我已經看到了很多可以用來IDebugEventCallback2解決問題的問題,但我是一個新手,沒有難做具體的例子來了解

我從來沒有寫過這相關的代碼,MSDN上都可發現這種信息也很少的例子,如果有一些資料或例子我會很感激.... QAQ

英語不是我的母語,可能會有一些語法錯誤,我感到很抱歉。

+0

時得到通知的模式改變您可以使用AdviseDebuggerEvents/UnadviseDebuggerEvents方法傳遞實現IVsDebuggerEvents接口的類,例如IDebugEve ntCallback2 https://github.com/Excel-DNA/VSExcel/blob/master/Source/ExcelDnaTools/DebugManager.cs –

+0

非常感謝,現在我可以在VS – liziyi

+0

的擴展中獲得調試狀態我很高興知道您是否可以解決問題,可否請您發佈解決方案並將其標記爲答案,這對有類似問題的其他社區會有好處。 –

回答

0

這個答案是在C#中的Visual Studio包模板 文件結構如下,不同的項目名稱設置可能會有所不同,但類似的基地,我已經修改了所選擇的兩個文件(MyControl.xaml,VSPackageHW2Package.cs ) FileStruct

1.定義從VSPackageHW2Package.cs可變

public static VSPackageHW2Package package; 
readonly IVsDebugger _debugger; 
readonly DTE _dte; 
readonly Debugger2 _dteDebugger; 
readonly uint _debuggerEventsCookie; 

2.pass值MyControl.xaml(改變VSPackageHW2Package.cs唯一的地方)

在MyControl.xaml
public VSPackageHW2Package() 
{ 
    Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString())); 
    MyControl.package = this; 
} 

3.Implement接口 IVsDebuggerEvents

4.in構造

public MyControl() 
{ 
    InitializeComponent(); 

    var packageServiceProvider = (IServiceProvider)package; 
    _debugger = packageServiceProvider.GetService(typeof(SVsShellDebugger)) as IVsDebugger; 
    _dte = packageServiceProvider.GetService(typeof(SDTE)) as DTE; 

    if (_debugger.AdviseDebuggerEvents(this, out _debuggerEventsCookie) != VSConstants.S_OK) 
    { 
     MessageBox.Show("DebugManager setup failed"); 
    } 
    else 
    { 
     MessageBox.Show("ok"); 
    } 
} 

完全MyControl.xaml文件:

using EnvDTE; 
using EnvDTE80; 
using Microsoft.VisualStudio; 
using Microsoft.VisualStudio.Shell.Interop; 
using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace Company.VSPackageHW2 
{ 
    /// <summary> 
    /// Interaction logic for MyControl.xaml 
    /// </summary> 
    public partial class MyControl : UserControl,IVsDebuggerEvents 
    { 
     public static VSPackageHW2Package package; 
     readonly IVsDebugger _debugger; 
     readonly DTE _dte; 
     readonly Debugger2 _dteDebugger; 
     readonly uint _debuggerEventsCookie; 

     public MyControl() 
     { 
      InitializeComponent(); 

      var packageServiceProvider = (IServiceProvider)package; 
      _debugger = packageServiceProvider.GetService(typeof(SVsShellDebugger)) as IVsDebugger; 
      _dte = packageServiceProvider.GetService(typeof(SDTE)) as DTE; 

      if (_debugger.AdviseDebuggerEvents(this, out _debuggerEventsCookie) != VSConstants.S_OK) 
      { 
       MessageBox.Show("DebugManager setup failed"); 
      } 
      else 
      { 
       MessageBox.Show("ok"); 
      } 
     } 

     [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1300:SpecifyMessageBoxOptions")] 



     private void button1_Click(object sender, RoutedEventArgs e) 
     { 

      MessageBox.Show(string.Format(System.Globalization.CultureInfo.CurrentUICulture, "We are inside {0}.button1_Click()", this.ToString()), 
          "lzyToolWindow"); 

     } 

     public int OnModeChange(DBGMODE dbgmodeNew) 
     { 
      MessageBox.Show("debug mode change"); 
      throw new NotImplementedException(); 
     } 
    } 
}