Я пишу расширение отладки VSPackage, в котором я хочу выполнить инструкцию в отладочном процессе, когда ударяется точка останова. В моем добавочном коде у меня есть следующее:
void Initialize()
{
// ...standard vspackage init code omitted...
Globals.Init((DTE2)GetService(typeof(DTE)));
Globals.DebuggerEvents.OnEnterBreakMode += (dbgEventReason reason, ref dbgExecutionAction action) =>
{
try
{
var e1 = Globals.Application.Debugger.GetExpression("1+2");
Debug.WriteLine(e1.Value); // Prints "3"
Globals.Application.Debugger.ExecuteStatement("x = 1+2", 1000);
Debug.WriteLine("OK"); // Never prints this
}
catch (Exception ex)
{
Debug.WriteLine("Error: "+ex); // Nor this
}
}
}
При отладке этого расширения в экземпляре VS я загружаю тривиальную программу, похожую на это
static void Main()
{
int x = 5;
Console.WriteLine("X is "+x); // Breakpoint on this line
}
Когда точка останова попадает в отлаженный процесс, вызывающий обработчик вызывается, а окно вывода для расширения показывает "3", поэтому оценка выражений работает, но никогда не удается выполнить оператор. В окне вывода ничего больше не печатается. Исключение или тайм-аут не происходит, и я не могу продолжить отладку процесса, кажется, что отладчик разбился.
Класс globals содержит только DTE и DebuggerEvents
public static class Globals
{
public static void Init(DTE2 dte)
{
Application = dte;
DebuggerEvents = dte.Events.DebuggerEvents;
}
public static DTE2 Application { get; private set; }
public static DebuggerEvents DebuggerEvents { get; private set; }
}
Что я делаю неправильно или неправильно понимаю здесь?