Проверьте, было ли приложение запущено из Visual Studio - PullRequest
35 голосов
/ 19 сентября 2008

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

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

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

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

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

Ответы [ 4 ]

62 голосов
/ 19 сентября 2008
16 голосов
/ 19 сентября 2008

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

if( IsDebuggerPresent() )
{
    ...
}

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

5 голосов
/ 24 августа 2012

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

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

Вы видите, что однажды я столкнулся с проблемой (* связанной с COM) Ошибка выполнения данных Ошибка, которая потребовала от меня запустить Событие после сборки , которое должно выполнить editbin.exe с параметром / NXCOMPAT: NO в сгенерированном VS EXE-файле.

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

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

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

0 голосов
/ 19 сентября 2008

Я бы настоятельно не рекомендовал использовать код, который запускается только во время отладки. Зачем? Вы хотите убедиться, что то, что входит в производство, - это то, что вы тестируете / видите локально. Это особенно верно для языка нижнего уровня, который вы используете, так как часто различие в коде заставляет компилятор по-разному генерировать ваш компьютер / IL.

Возможно, в целях обнаружения проблемы, но это все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...