#if(DEBUG)VS System.Diagnostics.Debugger.IsAttached

时间:2011-08-16 03:16:15

标签: .net visual-studio

在visual studio中使用#if (DEBUG)System.Diagnostics.Debugger.IsAttached有何不同?是否设置了DEBUG标志但没有附加调试器的情况,或者在未设置DEBUG标志时可以附加调试器的情况?

6 个答案:

答案 0 :(得分:38)

#if DEBUG确保代码在发布版本中根本不包含在程序集中。此外,#if DEBUG包含的代码一直在调试版本中运行 - 而不仅仅是在调试器下运行时。

Debugger.IsAttached表示无论是调试还是发布版本都包含代码。并且可以附加调试器以将版本发布到。

将两者结合使用是很常见的。 #if DEBUG通常用于记录日志,或减少内部测试版本中的异常处理。 Debugger.IsAttached倾向于仅用于决定是否吞下异常或向程序员展示它们 - 更多的是程序员的帮助而不是其他任何东西。

答案 1 :(得分:11)

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

答案 2 :(得分:5)

#if (DEBUG)是一个预处理程序指令,允许您有条件地编译代码。

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

答案 3 :(得分:2)

它没有任何共同之处。您可以调试Release版本。您可以在没有调试器的情况下运行Debug构建,按Ctrl + F5。

答案 4 :(得分:0)

条件属性是上面列出的属性的另一个相关选项。关于这个问题,这个问题的答案很好。

Need .NET code to execute only when in debug configuration

答案 5 :(得分:0)

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

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