web-dev-qa-db-ja.com

リリースビルドのDebug.WriteLine

DEBUGを定義せずにリリースビルドでDebug.WriteLineを使用する方法はありますか?

60
Karsten

いいえ。ただし、Traceを定義してTrace.WriteLine.を使用すると、リリースでTRACEを使用できます。こちらをご覧ください。

https://support.Microsoft.com/en-us/help/815788/how-to-trace-and-debug-in-visual-c

52
Nick

いいえ。DEBUGプリプロセッサーシンボルを定義しない場合、[Conditional("DEBUG")]属性が適用されるため、Debug.*への呼び出しはコンパイラーによって削除されます。

ただし、 Trace.WriteLine またはその他のロギングテクニックを検討することをお勧めします。

41
Jon Skeet

まだDEBUGを定義する必要がありますが、アセンブリ全体で行う必要はありません。必要なソースファイルでのみ定義できます。したがって、特定のクラスのデバッグロギングが必要な場合は、そのソースファイルに対してのみDEBUGを定義できます。

#define DEBUG
using System.Diagnostics;

...

class Logger
{
    void Log( string msg ){ Debug.WriteLine( msg ); }
}
18
Paul Alexander

はい。上記のコメントで述べたように、式ツリーを使用して、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

3
user3513472