需要.NET代码才能在调试配置中执行

时间:2010-08-04 20:33:43

标签: c# .net vb.net visual-studio debugging

我有一些代码可以访问网络上的API。 API的一个参数允许我让他们知道我正在测试。

我想在测试时只在我的代码中设置此参数。目前,我只是在发布版本时对代码进行评论。

是否有基于构建配置的自动方式?

8 个答案:

答案 0 :(得分:88)

解决方案

您可以使用以下其中一项 -

1:Conditional属性

Conditional属性向编译器指示应忽略方法调用或属性,除非定义了指定的条件编译符号。

代码示例:

[Conditional("DEBUG")]
static void Method() { } 

2:#if预处理程序指令

当C#编译器遇到#if preprocessor directive,最后是#endif指令时,只有在定义了指定的符号时才会编译指令之间的代码。与C和C ++不同,您无法为符号指定数值。 C#中的#if语句是布尔值,仅测试符号是否已定义。

代码示例:

#if DEBUG
    static int testCounter = 0;
#endif 

3:Debug.Write方法

Debug.Write(和Debug.WriteLine)将有关调试的信息写入Listeners集合中的跟踪侦听器。

另请参阅Debug.WriteIfDebug.WriteLineIf

代码示例:

Debug.Write("Something to write in Output window.");

注释

请注意使用#if指令,因为它可能会在发布版本中产生意外情况。例如,请参阅:

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);

在这种情况下,非Debug构建将打印空白消息。但是,在另一种情况下,这可能会引发NullReferenceException

了解更多

另见

还有一个工具DebugView,它允许从外部应用程序捕获调试信息。

答案 1 :(得分:31)

是的,将代码包装在

#if DEBUG
// do debug only stuff 
#else
// do non DEBUG stuff
#endif

Google "C# compilation symbols"

当您处于调试配置时,Visual Studio会自动定义DEBUG。您可以定义所需的任何符号(查看项目的属性,构建选项卡)。请注意,滥用预处理程序指令是一个坏主意,它可能导致代码很难读取/维护。

答案 2 :(得分:13)

我遇到了同样的问题,我使用的解决方案是:

if (System.Diagnostics.Debugger.IsAttached)
{
    // Code here
}

这意味着从技术上讲,您可以附加调试器并运行该段代码。

答案 3 :(得分:7)

除#if #endif指令外,您还可以使用条件属性。如果使用属性

标记方法
[Conditional("Debug")]

只有在应用程序以调试模式构建时才会编译和运行它。正如下面的注释中所指出的,这些仅在方法具有void返回类型时才起作用。

答案 4 :(得分:2)

public int Method ()
{
#if DEBUG 
   // do something 
#endif
}

答案 5 :(得分:2)

以下是另一篇结果相似的帖子:http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

可以在http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

看到更好的解释
// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}

答案 6 :(得分:2)

以下是安全的使用方法:

var isDebug = false;
#if DEBUG
    isDebug = System.Diagnostics.Debugger.IsAttached;
#endif

if (isDebug) {
    // Do something
}

答案 7 :(得分:0)

这适用于asp.net:

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
    //send email to developer;
else
    //send email to customer;

来自Rick Strahl @ Detecting-ASPNET-Debug-mode