发布版本中的Debug.WriteLine

时间:2011-03-24 12:58:44

标签: c# .net debugging

有没有办法在版本构建中使用Debug.WriteLine而不定义DEBUG

4 个答案:

答案 0 :(得分:48)

不,但您可以通过定义Trace并使用TRACE在发布中使用Trace.WriteLine.查看此处:

  

https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

答案 1 :(得分:41)

没有。如果您未定义DEBUG预处理程序符号,则由于应用了Debug.*属性,编译器将删除对[Conditional("DEBUG")]的任何调用。

您可能需要考虑Trace.WriteLine或其他日志记录技术。

答案 2 :(得分:18)

虽然你仍然需要定义DEBUG - 你不必在程序集范围内进行。您只能在所需的源文件中定义它。因此,如果您希望从特定类进行调试日志记录,则只需为该源文件定义DEBUG。

#define DEBUG
using System.Diagnostics;

...

class Logger
{
    void Log( string msg ){ Debug.WriteLine( msg ); }
}

答案 3 :(得分:3)

是。您可以使用表达式树,如上面的注释中所述,使用TRACE,或者不定义任何编译时常量。

        var p = Expression.Parameter(typeof(string), "text");
        var callExp =
            Expression.Call(
              typeof(System.Diagnostics.Debug).GetRuntimeMethod(
                   "WriteLine", new [] { typeof(string) }),
              p);
        Action<string> compiledAction = Expression.Lambda<Action<string>>(
                                         callExp, p)
                                         .Compile();

在此之后,您可以通过调用

随时调用Debug.WriteLine
        compiledAction("Debug text");

你实际上是通过不使用静态方法调用来欺骗编译器,而是在运行时动态构造它。

没有性能影响,因此编译并重复使用该动作。

这就是我在SharpLog中编写DebugLogger的方法。

  

如果你感兴趣的话,可以在这里查看源代码:https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs