DEBUG
を定義せずにリリースビルドでDebug.WriteLine
を使用する方法はありますか?
いいえ。ただし、Trace
を定義してTrace.WriteLine.
を使用すると、リリースでTRACE
を使用できます。こちらをご覧ください。
https://support.Microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c
いいえ。DEBUG
プリプロセッサーシンボルを定義しない場合、[Conditional("DEBUG")]
属性が適用されるため、Debug.*
への呼び出しはコンパイラーによって削除されます。
ただし、 Trace.WriteLine
またはその他のロギングテクニックを検討することをお勧めします。
まだDEBUGを定義する必要がありますが、アセンブリ全体で行う必要はありません。必要なソースファイルでのみ定義できます。したがって、特定のクラスのデバッグロギングが必要な場合は、そのソースファイルに対してのみDEBUGを定義できます。
#define DEBUG
using System.Diagnostics;
...
class Logger
{
void Log( string msg ){ Debug.WriteLine( msg ); }
}
はい。上記のコメントで述べたように、式ツリーを使用して、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