【问题标题】:How to use the Debug API in Visual Studio Extension?如何在 Visual Studio 扩展中使用调试 API?
【发布时间】:2017-04-05 15:41:33
【问题描述】:

看过很多相关的问题,还是觉得很不解

我现在主要遇到的问题是无法获取调试过程的当前状态,比如什么时候遇到断点。

看到很多问题可以用IDebugEventCallback2解决问题,但是我是菜鸟,没有具体例子难以理解

我没写过这个相关的代码,MSDN上可以查到的资料也很少,例子也很少,如果有资料或例子不胜感激....QAQ

英语不是我的母语,可能有一些语法错误,我很抱歉。

【问题讨论】:

  • 要在模式更改时收到通知,您可以使用 AdviseDebuggerEvents / UnadviseDebuggerEvents 方法传递实现 IVsDebuggerEvents 接口的类,例如 IDebugEventCallback2 github.com/Excel-DNA/VSExcel/blob/master/Source/ExcelDnaTools/…
  • 非常感谢,现在我可以在VS的扩展中获得调试状态
  • 很高兴知道您解决了这个问题,请您发布您的解决方案并将其标记为答案,这将有助于其他有类似问题的社区。​​span>

标签: c# visual-studio visual-studio-extensions vs-extensibility extensibility


【解决方案1】:

此答案基于 C# 中的 Visual Studio 包模板 文件结构如下,不同的项目名称设置可能不同但相似,我对选中的两个文件做了修改(MyControl.xaml, VSPackageHW2Package.cs) FileStruct

1.定义变量

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

2.将值从VSPackageHW2Package.cs传到MyControl.xaml(唯一改变VSPackageHW2Package.cs的地方)

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

3.MyControl.xaml中实现接口 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();
        }
    }
}

【讨论】:

  • 在生产代码中,应在非用户控件类控件中实现IVsDebuggerEvents,将业务逻辑与UI代码分离,并在VSPackage.Dispose中调用IVsDebugger.UnadviseDebuggerEvents
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多