我看過很多關於相關的問題,但還是覺得很困惑如何在Visual Studio Extension中使用調試API?
我現在主要遇到的問題是無法獲得調試過程的當前狀態,比如何時遇到斷點。
我已經看到了很多可以用來IDebugEventCallback2
解決問題的問題,但我是一個新手,沒有難做具體的例子來了解
我從來沒有寫過這相關的代碼,MSDN上都可發現這種信息也很少的例子,如果有一些資料或例子我會很感激.... QAQ
英語不是我的母語,可能會有一些語法錯誤,我感到很抱歉。
我看過很多關於相關的問題,但還是覺得很困惑如何在Visual Studio Extension中使用調試API?
我現在主要遇到的問題是無法獲得調試過程的當前狀態,比如何時遇到斷點。
我已經看到了很多可以用來IDebugEventCallback2
解決問題的問題,但我是一個新手,沒有難做具體的例子來了解
我從來沒有寫過這相關的代碼,MSDN上都可發現這種信息也很少的例子,如果有一些資料或例子我會很感激.... QAQ
英語不是我的母語,可能會有一些語法錯誤,我感到很抱歉。
這個答案是在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.xamlpublic 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();
}
}
}
時得到通知的模式改變您可以使用AdviseDebuggerEvents/UnadviseDebuggerEvents方法傳遞實現IVsDebuggerEvents接口的類,例如IDebugEve ntCallback2 https://github.com/Excel-DNA/VSExcel/blob/master/Source/ExcelDnaTools/DebugManager.cs –
非常感謝,現在我可以在VS – liziyi
的擴展中獲得調試狀態我很高興知道您是否可以解決問題,可否請您發佈解決方案並將其標記爲答案,這對有類似問題的其他社區會有好處。 –