#if (DEBUG) VS System.Diagnostics.Debugger.IsAttached 如果(DEBUG)VS系统。诊断。调试器是否已连接

49
在Visual Studio中,使用#if (DEBUG)System.Diagnostics.Debugger.IsAttached有何不同?DEBUG标志被设置但没有调试器附加的情况是否存在?或者在DEBUG标志未设置时调试器可能会附加的情况是否存在?
6个回答

72

#if DEBUG 确保在发布版本中代码根本不会被包含在程序集中。同时,在调试构建下,由 #if DEBUG 包含的代码始终运行--而不仅仅是在调试器下运行时。

Debugger.IsAttached意味着该代码将在调试和发布版本中都被包含。并且也可以将调试器附加到发布版本上。

通常会同时使用两者。#if DEBUG 通常用于类似记录日志或减少内部测试构建中的异常处理等方面。Debugger.IsAttached 则主要用于决定是忽略异常还是向程序员显示异常--更多地是作为程序员辅助工具。


14

#if DEBUG 是一个编译时检查,意味着它所包围的代码只有在定义了 DEBUG 预处理器符号时,才会包含在输出程序集中。Debugger.IsAttached 是一个运行时检查,因此调试代码仍然被包含在程序集中,但只有在进程附加了调试器时才会执行。


5

#if (DEBUG) 是一个预处理指令,可以让您有条件地编译代码。

System.Diagnostics.Debugger.IsAttached 提供了一个运行时值,指示调试器是否附加到进程。


它能检测到任何调试器是否已连接?还是只能检测托管调试器? - JohnZaj
@JohnZaj 这篇文章说的是仅适用于托管调试器。IsDebuggerPresent 可以检测本地调试器。它是否适用另当别论。 - HABO

3

它们并没有共同点。您可以调试发布版本,而且您可以在不使用调试器的情况下运行调试版本,按Ctrl+F5即可。


0
        private void ConfigureOAuthTokenConsumption(IAppBuilder app)
        {
#if DEBUG
            AuthenticateViaAppOwnIdentity(app);
#else
AuthenticateViaAzureAD(app);
#endif    
        }

使用这段代码,只需尝试将构建从调试更改为发布,反之亦然。运行/排除的代码将自动显示为黑色和灰色,分别在VS中进行更改。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接