debugging 发行版本中的Debug.WriteLine

kzmpq1sx  于 2022-11-14  发布在  其他
关注(0)|答案(5)|浏览(129)

有没有办法在不定义DEBUG的情况下在发布版本中使用Debug.WriteLine

mnowg1ta

mnowg1ta1#

不可以,但是您可以通过定义TRACE并使用Trace.WriteLine.来在release中使用Trace
https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

vxqlmq5t

vxqlmq5t2#

不可以。如果不定义DEBUG预处理器符号,则由于应用了[Conditional("DEBUG")]属性,编译器将删除对Debug.*的任何调用。
但是,您可能需要考虑Trace.WriteLine或其他日志记录技术。

juud5qan

juud5qan3#

虽然你仍然需要定义DEBUG --你不需要在程序集范围内定义它。你可以只在你想要的源文件中定义它。所以如果你想从一个特定的类中调试日志记录,你可以只为那个源文件定义DEBUG。

#define DEBUG
using System.Diagnostics;

...

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

6mw9ycah4#

是的。正如上面的注解中提到的,您可以使用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

sg24os4d

sg24os4d5#

Debugger.Log(0, null, "Your string here");可以是一个替代项,它由Debug.Write在内部使用,并且在发布版本中也有效。

相关问题