Есть ли способ использовать Debug.WriteLine
в сборке релиза без определения DEBUG
?
Debug.WriteLine в выпуске
Ответ 1
Нет, но вы можете использовать Trace
в выпуске, указав Trace
и используя Trace.WriteLine.
. Посмотрите здесь:
Ответ 2
Нет. Если вы не определяете символ препроцессора DEBUG
, любые вызовы Debug.*
будут удалены компилятором из-за применяемого атрибута [Conditional("DEBUG")]
.
Возможно, вы захотите рассмотреть Trace.WriteLine
или другие методы ведения журнала.
Ответ 3
Пока вам еще нужно определить DEBUG - вам не нужно делать это сбоку. Вы можете определить его только в исходных файлах, которые вы хотите. Поэтому, если вы хотите вести отладочный журнал из определенного класса, вы можете определить DEBUG только для этого исходного файла.
#define DEBUG
using System.Diagnostics;
...
class Logger
{
void Log( string msg ){ Debug.WriteLine( msg ); }
}
Ответ 4
Да. Вы можете, как упоминалось в приведенных выше комментариях, использовать 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");
Вы, по сути, обманываете компилятор, не имея статического вызова метода, а вместо этого динамически создавая его во время выполнения.
С момента выхода из строя не произошло никакого действия, действие скомпилировано и повторно использовано.
Вот как я написал DebugLogger в SharpLog.
Вы можете взглянуть на исходный код здесь, если он вас интересует: https://github.com/prasannavl/SharpLog/blob/master/SharpLog/DebugLogger.cs