4

我搞砸了Visual Studio加载项API,试图查看我想要做的事情是否可能。有一件事我现在正在做的是一样的东西:如何在Visual Studio加载项中获取当前行号/异常情况?

public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) 
    { 
     _applicationObject.Events.DebuggerEvents.OnExceptionThrown += DebuggerEvents_OnExceptionThrown; 
     handled = false; 
     if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) 
     { 
      if(commandName == "MyAddin1.Connect.MyAddin1") 
      { 
       handled = true; 
       return; 
      } 
     } 
    } 

    void DebuggerEvents_OnExceptionThrown(string ExceptionType, string Name, int Code, string Description, ref dbgExceptionAction ExceptionAction) 
    { 
     //how to get line number here? 
    } 

理想情况下,我希望能够得到当前函数和行号每当异常由正在调试的程序抛出。这可能吗?

回答

0

这些信息显然是从调试信息中解除的。因此,它并不总是可用的,我想这就是为什么在这种情况下StackFrames对象没有实现它的原因。

无论如何,要获得带有文件和行号信息(以及IL偏移量等)的堆栈跟踪,您必须在调试应用程序的上下文中动态执行代码。你可以使用GetExpression来做到这一点。

总结:

var tmp = dte.Debugger.GetExpression(
    "new System.Diagnostics.StackTrace(true).ToString();", true); 

这将返回一个字符串的堆栈跟踪,包括文件和行号。不过,你必须分析这个返回的字符串实际上利用它,我承担这是比更多的更慢common method

相关问题