Как получить номер текущей строки при прерывании/исключении в надстройке 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?
    }

В идеале я хотел бы иметь возможность получать текущую функцию и номер строки всякий раз, когда отлаживаемая программа выдает исключение. Это возможно?




Ответы (1)


Эта информация, по-видимому, взята из отладочной информации. Таким образом, он не всегда доступен, я думаю, поэтому для объекта StackFrames имеет смысл не реализовывать его в этом случае.

В любом случае, чтобы получить трассировку стека с информацией о номере файла и строки (и смещении IL и т. д.), вы должны динамически выполнять код в контексте отлаживаемого приложения. Вы можете сделать это, используя GetExpression.

В итоге:

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

Это вернет строку с трассировкой стека, включая номера файлов и строк... Однако вы должны проанализировать эту возвращенную строку, чтобы фактически использовать ее, и я предполагаю, что это намного медленнее, чем более общий метод

person Earlz    schedule 10.01.2013