Подтвердить что ты не робот

Проверьте, запущено ли приложение из Visual Studio

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

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

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

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

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

4b9b3361

Ответ 2

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

if( IsDebuggerPresent() )
{
    ...
}

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

Ответ 3

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

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

Как я понял, однажды я столкнулся с проблемой (связанной с COM) предотвращением выполнения данных, которая потребовала от меня запуска Post Post Event, которая выполнила бы editbin.exe с помощью /NXCOMPAT: NO на сгенерированном VS EXE.

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

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

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

Ответ 4

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

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