В чем разница между IsDebuggingEnabled и Debugger.IsAttached

Существуют ли различия между System.Web.HttpContext.Current.IsDebuggingEnabled и System.Diagnostics.Debugger.IsAttached?

Если да, то каковы точные различия, кроме того, что он предназначен только для веб-приложений, а другой работает во всех проектах?

Ответы

Ответ 1

HttpContext.IsDebuggingEnabled относится к настройке компиляции в web.config. Debugger.IsAttached определяет, действительно ли активный отладчик прослушивает информацию, поступающую с веб-сервера.

См. объяснение в DotnetPerls в отношении HttpContext.IsDebuggingEnabled:

Режим отладки не является значением по умолчанию.... Когда вы не устанавливаете debug = "true" в Web.config, сайт компилируется в режиме Release.

Что касается вашего вопроса, почему первый "только для веб-приложений": веб-приложения могут компилироваться во время выполнения, тогда как все остальные .NET-продукты предварительно скомпилированы. Из-за этого вы можете определить в web.config, если сборка выполняется в режиме отладки или выпуска. Это только вариант ASP.NET, поэтому свойство доступно только там.

Как ответ на ваш второй вопрос, почему первый вариант предназначен только для ASP.NET: есть также способ для приложения Windows проверить статус сборки: путем проверки DebuggableAttribute, как описано в Как проверить, была ли сборка построена с использованием конфигурации Debug или Release?.

Ответ 2

IsDebuggingEnabled относится к "режиму отладки", который не обязательно означает, что отладчик фактически привязан. Вы можете настроить веб-сайты ASP.NET в режим отладки, установив <compilation debug="true"> в ваш web.config файл.

Когда веб-сайт находится в режиме отладки, оптимизация JIT не применяется к коду, содержащемуся в ваших файлах просмотра (.aspx,.cshtml и т.д.), а также к любым файлам, закодированным во время выполнения, или к каталогу App_Code. Существуют и другие эффекты.