2008-09-19 2 views
32

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

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

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

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

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

+0

Примечание: Я получил следующие строки при попытке этой техники vstest.executionengine.x86.exe WebDev.WebServer20.exe запуска из теста Visual Studio и с помощью кода, работающего под IIS Express. Поэтому любому, кто читает это, может потребоваться соответствующим образом скорректировать код. – 2015-08-07 09:23:26

ответ

57
+0

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

+0

@Barniferous, похоже, что начиная с VS 2017 проверка «.vshost» больше не работает, так как VS 2017 перестала добавлять ее к имени. Я не знаю, что делают тесты CodedUI ... – Jim 2017-03-23 17:41:32

-2

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

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

+2

В этом случае на самом деле это наоборот. Крюки мешают мне отлаживать (нажатие клавиши вызывает студию и, в конечном итоге, все другие приложения, в которых я пытаюсь ввести что-то, чтобы заморозить, потому что события не могут быть обработаны), поэтому я не устанавливаю их в сборках отладки. – Grimtron 2008-09-19 13:43:41

+0

Я не согласен с этим плакатом. Я сталкивался с многочисленными случаями, когда мне нужно внедрять код, который работает только в среде IDE или никогда не запускается в среде IDE. Вы пишете этот код, тестируете его отдельно и чертовски уверены, что он работает, а затем добавьте код, чтобы он запускался только в том случае, если вы не работаете в среде IDE. – Barniferous 2016-09-30 12:00:54

14

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

if(IsDebuggerPresent()) 
{ 
    ... 
} 

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

5

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

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

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

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

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

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