Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测调试是否成功_C#_Asp.net Core_.net Core - Fatal编程技术网

C# 如何检测调试是否成功

C# 如何检测调试是否成功,c#,asp.net-core,.net-core,C#,Asp.net Core,.net Core,我有一个.Net核心控制台应用程序。在my startup.cs中的configure方法中,我试图测试调试器是否已启用: if (HttpContext.Current.IsDebuggingEnabled) loggerFactory.AddConsole(Configuration); else loggerFactory.AddConsoleJson(Configuration); HttpContext.Current.IsDebuggingEnabled在.

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

 if (HttpContext.Current.IsDebuggingEnabled)
     loggerFactory.AddConsole(Configuration);
 else
     loggerFactory.AddConsoleJson(Configuration);
HttpContext.Current.IsDebuggingEnabled
在.Net核心中不受支持。我还没有找到一种在.NETCore中有效的方法


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

HttpContext
是另一个
HttpContext
,因为您现在使用的是ASP.NET核心。在ASP.NET核心变量中找不到该属性。这些差异的解释如下所示


我将使用
Debugger.IsAttached
,它不仅检查调试是否已启用,还检查是否正在进行调试。

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

ASP.NET Core不使用
System.Web
命名空间中的类型,在旧ASP.NET世界中应用的任何内容都需要重新评估,以确定它是否仍然与
Microsoft.AspNetCore
命名空间中的适当新类型一起工作

对于
HttpContext
,新类型为。但是,它没有一个
IsDebuggingEnabled
属性

原因是旧的ASP.NET是在web服务器(最常见的是IIS)中运行的应用程序,而web服务器为应用程序提供了HttpContext。因此,您必须使用
HttpContext.Current
访问该上下文

然而,在ASP.NET核心中,应用程序包括Web服务器,使ASP.NET核心应用程序能够完全独立于此运行。现在,当调试ASP.NET Core时,您将连接到ASP.NET Core应用程序本身的进程,而不是连接到父Web服务器。这也是为什么您通常要创建命令行应用程序(其中包含带有应用程序代码的Web服务器)。因为它们是普通的(命令行)应用程序,所以必须使用标准工具来确定是否附加了调试器

通常的方法是检查:

if (Debugger.IsAttached)
{
    // debugger is attached
}

但是,请注意,当应用程序启动时,调试器不需要正确连接。只在应用程序已经运行时才附加调试器是完全正确的。这一点很重要,因为当应用程序启动时,
启动
中的代码将只运行一次。因此,即使附加了调试器,注册日志提供程序的代码也可能在尚未附加调试器的时间运行。

如果希望在调试中而不是在发行版中运行一段代码,可以使用#If预处理器指令

#if(DEBUG)
  debug code here...
#else
  release code here...
#endif

如果您不想在发布版本的构建中运行任何东西,只需不包括else块。

我建议您修正关于
HttpContext
的评论,因为您显然没有注意到这个问题是关于ASP.NET核心的,它通常是一个控制台应用程序。
HttpContext.Current
不起作用的原因是另一个原因。你是对的。人们经常把.NET标准和.NET核心混为一谈,所以我想OP也这样做了。我更新了我的答案。@poke your right。我总是忘记这一点。如果您感兴趣,它的代码从我的身份服务器。我对.net Core还是个新手,请下面的选民发表评论。我很乐意改进这个问题,以便将来帮助他人。这是否回答了你的问题?这适用于调试版本与发布版本,并在编译时而不是运行时进行检查。附加的调试器与使用调试符号生成的调试器之间存在巨大差异。