Отлаживать.WriteLine в сборке выпуска
есть ли способ, чтобы использовать Debug.WriteLine
в сборке выпуска без определения DEBUG
?
4 ответа:
нет, но вы можете использовать
Trace
в релизе определениеTRACE
и с помощьюTrace.WriteLine.
посмотреть здесь:https://support.microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c
нет. Если вы не определяете
DEBUG
символ препроцессора, любые звонкиDebug.*
будет удален компилятором из-за[Conditional("DEBUG")]
атрибут применяется.вы можете рассмотреть
Trace.WriteLine
или другие методы ведения журнала, хотя.
хотя вам все еще нужно определить DEBUG - вам не нужно делать это в сборке. Вы можете определить его только в исходных файлах, которые вы хотите. Поэтому, если вы хотите вести журнал отладки из определенного класса, вы можете определить DEBUG только для этого исходного файла.
#define DEBUG using System.Diagnostics; ... class Logger { void Log( string msg ){ Debug.WriteLine( msg ); } }
да. Вы можете, как упоминалось в приведенных выше комментариях, использовать трассировку или без определения каких-либо констант времени компиляции, используя деревья выражений.
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();
после этого можно вызвать отладку.WriteLine в любое время, позвонив
compiledAction("Debug text");
вы по существу обманываете компилятор, не имея вызова статического метода, но вместо этого динамически строите его во время выполнения.
нет производительности-хит с тех пор, действие компилируется и повторно используется.
вот как я написал отладчик в SharpLog.
вы можете взглянуть на исходный код здесь, если он вас интересует:https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs