发布版本中的Debug.WriteLine

Kar*_*ten 61 .net c# debugging

有没有一种方法可以Debug.WriteLine在发布版本中使用而无需定义DEBUG

Nic*_*ick 53

不,但您可以Trace通过定义TRACE和使用来使用in发布Trace.WriteLine.在这里查看:

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

  • 完善.我只是想使用SysInternals DebugViewer和Trace.WriteLine似乎被它接受了 (3认同)

Jon*_*eet 41

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

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


Pau*_*der 19

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

#define DEBUG
using System.Diagnostics;

...

class Logger
{
    void Log( string msg ){ Debug.WriteLine( msg ); }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

是的。正如上面评论中提到的,您可以使用 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();
Run Code Online (Sandbox Code Playgroud)

之后,您可以随时调用 Debug.WriteLine,方法是:

        compiledAction("Debug text");
Run Code Online (Sandbox Code Playgroud)

您本质上是通过不进行静态方法调用而是在运行时动态构造它来欺骗编译器。

由于该操作已编译并重用,因此不会对性能造成影响。

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

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

  • 我不知道我是否会推荐这个..但这是一个“有趣”的解决方案。 (2认同)