有没有办法在不定义DEBUG的情况下在发布版本中使用Debug.WriteLine?
DEBUG
Debug.WriteLine
mnowg1ta1#
不可以,但是您可以通过定义TRACE并使用Trace.WriteLine.来在release中使用Trace。https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c
TRACE
Trace.WriteLine.
Trace
vxqlmq5t2#
不可以。如果不定义DEBUG预处理器符号,则由于应用了[Conditional("DEBUG")]属性,编译器将删除对Debug.*的任何调用。但是,您可能需要考虑Trace.WriteLine或其他日志记录技术。
[Conditional("DEBUG")]
Debug.*
Trace.WriteLine
juud5qan3#
虽然你仍然需要定义DEBUG --你不需要在程序集范围内定义它。你可以只在你想要的源文件中定义它。所以如果你想从一个特定的类中调试日志记录,你可以只为那个源文件定义DEBUG。
#define DEBUG using System.Diagnostics; ... class Logger { void Log( string msg ){ Debug.WriteLine( msg ); } }
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
sg24os4d5#
Debugger.Log(0, null, "Your string here");可以是一个替代项,它由Debug.Write在内部使用,并且在发布版本中也有效。
Debugger.Log(0, null, "Your string here");
Debug.Write
5条答案
按热度按时间mnowg1ta1#
不可以,但是您可以通过定义
TRACE
并使用Trace.WriteLine.
来在release中使用Trace
。https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c
vxqlmq5t2#
不可以。如果不定义
DEBUG
预处理器符号,则由于应用了[Conditional("DEBUG")]
属性,编译器将删除对Debug.*
的任何调用。但是,您可能需要考虑
Trace.WriteLine
或其他日志记录技术。juud5qan3#
虽然你仍然需要定义DEBUG --你不需要在程序集范围内定义它。你可以只在你想要的源文件中定义它。所以如果你想从一个特定的类中调试日志记录,你可以只为那个源文件定义DEBUG。
6mw9ycah4#
是的。正如上面的注解中提到的,您可以使用TRACE,或者不定义任何编译时常量,使用表达式树。
在这之后,您可以随时调用Debug.WriteLine,方法是调用
您没有静态方法调用,而是在运行时动态构造它,这实际上是在欺骗编译器。
不会影响性能,因为操作已编译并重新使用。
这就是我在SharpLog中编写DebugLogger的方法。
如果您感兴趣,可以在此处查看源代码:https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs
sg24os4d5#
Debugger.Log(0, null, "Your string here");
可以是一个替代项,它由Debug.Write
在内部使用,并且在发布版本中也有效。