Как включить или отключить точки останова во время выполнения? Я пишу тестовое приложение Workbench, которое может запускать другой .net-код для отладки плагинов. Сам приложение workbench не отлаживается (DebuggableNonUserCodeAttribute), но код пользователя, который он вызывает, должен быть. Но тогда, при определенных обстоятельствах во время выполнения, контрольные точки пользовательского кода не должны выполняться.
Я могу представить себе различные способы достижения этого, многие из них могут быть невозможны:
1) Привязать и отделить отладчик программно
2) Включить и отключить все точки останова программным способом (желательно локализовать на сборку или класс)
3) Динамически украшать и декомпорировать методы с помощью DebuggableNonUserCodeAttribute во время выполнения.
4) Как-то пометить целую ветвь кода потока за выбранным стековым фреймом как "не прерываемую" для отладчика. DebuggableNonUserCodeAttribute работает только в рамках метода или класса, но не влияет на отлаживаемость исходного кода.
РЕДАКТИРОВАТЬ: Чтобы уточнить: во время выполнения один и тот же фрагмент кода конечного пользователя будет выполняться несколько раз исполняющим файлом хостинга, в некоторых случаях, когда контрольные точки должны выполняться, а в других случаях их не должно быть. Было бы нецелесообразно требовать, чтобы пользователь изменял свой код для этой функции или требовал установки условных точек останова.
Вы можете сделать как # 1, так и # 2 через часть отладчика объектной модели автоматизации DTE.
Вы можете использовать System.Diagnostics.Debugger.Break() вместо установки контрольных точек. Просто поставьте вызов метода внутри, если бы блоки были необходимы.