Ответ 1
Интерфейсы автоматизации не могут быть и речи. В целях повышения производительности с их помощью я создал кеш из группы исключений в объект ExceptionSettings
и имя исключения для объекта ExceptionSetting
. Это позволило мне обойти ExceptionSettings.Item
для быстрого поиска отдельных исключений для вызова SetBreakWhenThrown
, но, к сожалению, внутренняя реализация SetBreakWhenThrown
включает в себя вызов для проверки аргументов, что, в свою очередь, вызывает внутренний процесс перечисления, который наносит весь этот подход, Кэш примерно в 4 раза быстрее, чем код, не использующий макрос, но мы все еще говорим о коде, который будет висеть IDE в течение нескольких минут...
ПРИМЕЧАНИЕ. Инструкции ниже были проверены до сих пор с помощью Visual Studio 2012.
Пройдя через SetBreakWhenThrown
в режиме разборки, выяснилось, что критический внутренний вызов (после проверки) составляет sdm::CDebugManager::SetException
. Оказывается, что отладчик оболочки (SVsShellDebugger
, который вы используете для IVsDebugger
) реализует IDebuggerInternal
, который обеспечивает доступ к текущему IDebugSession3
. Это свойство было не равным null после того, как я открыл решение, но до начала отладки.
IDebuggerInternal debugger = Package.GetGlobalService(typeof(SVsShellDebugger)) as IDebuggerInternal;
IDebugSession3 session = debugger != null ? debugger.CurrentSession : null;
Примечание. Интерфейс IDebuggerInternal
определяется в:
Microsoft.VisualStudio.Debugger.Interop.Internal, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
Используя информацию, возвращенную EnumSetExceptions
, я создал структуру, которая успешно изменяет настройки для исключения CLR! Вызовите IDebugSession3.SetException
, чтобы отключить отладчик при вызове исключения.
EXCEPTION_INFO[] exceptionInfo =
{
new EXCEPTION_INFO()
{
bstrExceptionName = typeof(NullReferenceException).FullName,
bstrProgramName = null,
dwCode = 0,
pProgram = null,
guidType = VSConstants.DebugEnginesGuids.ManagedOnly_guid,
dwState = enum_EXCEPTION_STATE.EXCEPTION_STOP_FIRST_CHANCE
| enum_EXCEPTION_STATE.EXCEPTION_STOP_SECOND_CHANCE
| enum_EXCEPTION_STATE.EXCEPTION_JUST_MY_CODE_SUPPORTED
| enum_EXCEPTION_STATE.EXCEPTION_STOP_USER_FIRST_CHANCE
| enum_EXCEPTION_STATE.EXCEPTION_STOP_USER_UNCAUGHT
}
};
hr = session.SetException(exceptionInfo);
Чтобы отключить останов отладчика, используйте IDebugSession3.RemoveSetException
вместо этого.