如何检测是否调试

DaI*_*mTo 19 c# .net-core asp.net-core

我有一个.Net Core控制台应用程序.在我的startup.cs中的configure方法中,我试图测试是否启用了调试器:

 if (HttpContext.Current.IsDebuggingEnabled)
     loggerFactory.AddConsole(Configuration);
 else
     loggerFactory.AddConsoleJson(Configuration);
Run Code Online (Sandbox Code Playgroud)

HttpContext.Current.IsDebuggingEnabled在.Net核心中不支持接缝.我还没有找到一个在.net核心中运行的方法.

System.Diagnostics.DebuggableAttribute.DebuggingModes.Default 似乎也不起作用.

Pat*_*man 41

HttpContextHttpContext因为你现在正在使用ASP.NET Core,所以是你习惯的另一个.在ASP.NET Core变体中找不到该属性.poke给出了差异的解释.

我会使用Debugger.IsAttached,它不仅会检查是否启用了调试,还会主动进行调试.

  • 你是对的.通常人们将.NET Standard和.NET Core混合起来,所以我认为OP也是如此.我更新了我的答案. (2认同)

Dev*_*ned 12

如果您想在 Debug 中运行一段代码而不是在 Release 中运行,可以使用 #if 预处理器指令。

#if(DEBUG)
  debug code here...
#else
  release code here...
#endif
Run Code Online (Sandbox Code Playgroud)

如果您不想在构建的发布版本中运行任何内容,只需不要包含 else 块即可。

  • 这是针对 DEBUG 与 RELEASE 构建的,并在编译时而不是运行时进行检查。附加的调试器和使用调试符号构建之间存在巨大差异。 (5认同)

pok*_*oke 7

HttpContext.Current指的System.Web.HttpContextSystem.Web旧ASP.NET中使用的命名空间的一部分.

ASP.NET Core不使用System.Web命名空间中的类型,并且需要重新评估在旧ASP.NET世界中应用的任何内容,无论它是否仍适用于Microsoft.AspNetCore命名空间中的相应新类型.

对于HttpContext,新类型是Microsoft.AspNetCore.Http.HttpContext.但是,它没有旧类型IsDebuggingEnabled属性.

原因是旧的ASP.NET是在Web服务器(最常见的IIS)中运行的应用程序,并且该Web服务器向应用程序提供了HttpContext.所以你必须用来HttpContext.Current访问那个上下文.

但是,在ASP.NET Core中,该应用程序包含 Web服务器,使ASP.NET Core应用程序能够完全独立于此运行.现在,在调试时,您现在将附加到ASP.NET Core应用程序本身的进程,而不是使用ASP.NET Core附加到父Web服务器.这也是您通常创建命令行应用程序(包含带有应用程序代码的Web服务器)的原因.由于它们是普通(命令行)应用程序,因此您必须使用标准工具来确定调试器是否已连接.

通常的方法是检查Debugger.IsAttached:

if (Debugger.IsAttached)
{
    // debugger is attached
}
Run Code Online (Sandbox Code Playgroud)

但请注意,在应用程序启动时,调试器不需要正确附加.稍后在应用程序运行时仅附加调试器是完全正常的.这很重要,因为您Startup或您的代码WebHostBuilder只会在应用程序启动时运行一次.因此,即使附加了调试器,注册日志记录提供程序的代码也可能在尚未附加调试器的情况下运行.