Как определить, если отладка
У меня есть консольное приложение .Net Core. В методе configure в моем startup.cs я пытаюсь проверить, включен ли отладчик или нет:
if (HttpContext.Current.IsDebuggingEnabled)
loggerFactory.AddConsole(Configuration);
else
loggerFactory.AddConsoleJson(Configuration);
HttpContext.Current.IsDebuggingEnabled
не поддерживается шов в ядре .Net. Мне не удалось найти метод, который работает в ядре .net.
System.Diagnostics.DebuggableAttribute.DebuggingModes.Default
тоже не работает.
Ответы
Ответ 1
HttpContext
- это еще один HttpContext
, чем вы использовали, так как теперь вы используете ASP.NET Core. Это свойство не может быть найдено в варианте ASP.NET Core. Объяснение различий дано poke.
Я бы использовал Debugger.IsAttached
, который не только проверяет, включена ли отладка, но и активно отлаживается.
Ответ 2
HttpContext.Current
относится к System.Web.HttpContext
, который является частью пространства имен System.Web
, которое использовалось в старом ASP.NET.
Ядро ASP.NET не использует типы в пространстве имен System.Web
, и все, что применяется в старом мире ASP.NET, должно быть переоценено, будет ли оно по-прежнему работать с соответствующими новыми типами в пространстве имен Microsoft.AspNetCore
.
Для HttpContext
новый тип Microsoft.AspNetCore.Http.HttpContext
. Однако у него нет свойства IsDebuggingEnabled
, которое у старого типа было.
Причина этого в том, что старый ASP.NET был приложением, которое выполнялось внутри веб-сервера (чаще всего IIS), и этот веб-сервер предоставлял HttpContext для приложения. Поэтому вам нужно было использовать HttpContext.Current
для доступа к этому контексту.
В ASP.NET Core, однако, приложение включает в себя веб-сервер, что делает приложения ASP.NET Core доступными для работы полностью независимо от этого. Теперь, когда отладка, а не привязка к родительскому веб-серверу, с ASP.NET Core, вы теперь присоединяетесь к процессу самого приложения ASP.NET Core. Именно поэтому вы обычно создаете приложения командной строки (которые содержат веб-сервер с кодом вашего приложения). И поскольку они являются нормальными (командной строкой) приложениями, вам придется использовать стандартные инструменты, чтобы выяснить, подключен ли отладчик.
Обычный способ для этого - проверить Debugger.IsAttached
для этого:
if (Debugger.IsAttached)
{
// debugger is attached
}
Однако обратите внимание, что отладчики не должны прикрепляться сразу при запуске приложения. Неплохо прикрепить отладчик позже, когда приложение уже запущено. Это важно, поскольку код в вашем Startup
или WebHostBuilder
будет запускаться только один раз при запуске приложения. Таким образом, возможно, что даже при подключении отладчика код, который зарегистрировал ваш поставщик протоколирования, работал в то время, когда отладчик еще не был прикреплен.
Ответ 3
Если вы хотите запустить часть кода в Debug, а не в Release, вы можете использовать директиву #if препроцессора.
#if(DEBUG)
debug code here...
#else
release code here...
#endif
Если вы не хотите запускать что-либо в версии версии сборки, просто не включайте блок else.