Проверьте, было ли приложение запущено из сеанса отладки Visual Studio

Я работаю над приложением, которое устанавливает общесистемную клавиатуру крюк. Я не хочу устанавливать этот хук, когда я запускаю отладку строить изнутри визуальной студии (иначе это повесит студию и, в конечном итоге, систему), и я могу избежать этого, проверив, Определен символ DEBUG.

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

В настоящее время я использую что-то вроде этого, чтобы проверить этот сценарий:

System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
string moduleName = currentProcess.MainModule.ModuleName;
bool launchedFromStudio = moduleName.Contains(".vshost");

Я бы назвал это «методом грубой силы», который работает в моих условиях, но я хотел бы знать, есть ли другой (лучший) способ обнаружения этого сценария.

Примечание. При использовании этой техники vstest.executionengine.x86.exe WebDev.WebServer20.exe запускается из теста Visual Studio и через код, работающий под IIS Express. Так что любому, кто это читает, возможно, придется соответствующим образом скорректировать код.

James Westgate 07.08.2015 12:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
36
1
18 557
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуйте: System.Diagnostics.Debugger.IsAttached

(Обновленный комментарий) Debugger.IsAttached адекватен и удовлетворяет многим требованиям. Однако он касается только того, подключен ли отладчик (любой отладчик, включая WinDbg). Если вы работаете в среде IDE без отладки, он не всегда будет работать так, как заявлено. Предлагаемый OP код - лучший способ определить, работает ли программа в среде IDE. ПРИМЕЧАНИЕ: тесты CodedUI не используют "vshost". Вместо этого они, среди прочего, используют QTAgent.exe, QTAgent32.exe и QTAgent64.exe. Так что используйте moduleName.ToLower.Contains("qtagent");.

Barniferous 30.09.2016 20:43

@Barniferous, похоже, начиная с VS 2017 проверка ".vshost" больше не работает, поскольку VS 2017 перестала добавлять его к имени. Я не знаю, что делают тесты CodedUI ...

Jim 23.03.2017 20:41

Для тех, кто работает с Windows API, есть функция, которая позволяет узнать, присутствует ли какой-либо отладчик, используя:

if ( IsDebuggerPresent() )
{
    ...
}

Ссылка: http://msdn.microsoft.com/en-us/library/ms680345.aspx

Я использовал этот подход, но затем увидел блог по следующей ссылке, где он утверждает, что отключил IsDebuggerPresent через скрипт: blogs.msdn.microsoft.com/debuggingtoolbox/2007/05/23/…

TBD 22.03.2016 09:27

Проверка того, содержит ли имя модуля текущего процесса строку ".vshost", - лучший способ, который я нашел, чтобы определить, работает ли приложение из VS IDE.

Использование свойства System.Diagnostics.Debugger.IsAttached также нормально, но оно не позволяет вам различать, запускаете ли вы EXE через команду Пробег VS IDE или запускаете отладочную сборку напрямую (например, с помощью проводника Windows или ярлыка), а затем присоединяетесь к нему. с помощью VS IDE.

Видите ли, однажды я столкнулся с проблемой (связанной с COM) ошибкой Предотвращение выполнения данных, которая потребовала от меня запустить Событие после сборки, который будет выполнять editbin.exe с параметром / NXCOMPAT: НЕТ в созданном VS EXE.

По какой-то причине EXE не был изменен, если вы просто нажали F5 и запустите программу, и поэтому AccessViolationExceptions будет возникать в коде, нарушающем DEP, если запускаться изнутри VS IDE, что чрезвычайно затрудняло отладку. Тем не менее, я обнаружил, что если я запустил сгенерированный EXE с помощью сокращенного набора, а затем подключил отладчик VS IDE, я мог бы протестировать свой код без возникновения исключений AccessViolationExceptions.

Итак, теперь я создал функцию, которая использует метод «vshost», который я могу использовать для предупреждения или блокировки выполнения определенного кода, если я просто занимаюсь ежедневным программированием из среды VS IDE.

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

Правильно, также не забывайте такие вещи, как удаленная отладка, другие отладчики, кроме Visual Studio и т. д.

atlaste 06.08.2014 23:54

См. Мой комментарий под сообщением OP, вы получите разные имена модулей, если запустите тестовый проект или проект IIS Express.

James Westgate 07.08.2015 12:23

Раньше я также проверял наличие «.vshost», но теперь похоже, что начиная с VS 2017 проверка «.vshost» больше не работает, поскольку VS 2017 перестала добавлять его к имени. Я наткнулся на эту ветку в поисках нового способа обнаружения отладки из VS.

Jim 23.03.2017 20:45

Другие вопросы по теме