web-dev-qa-db-ja.com

デバッグ構成でのみ実行する.NETコードが必要

Web上のAPIにアクセスするコードがいくつかあります。 APIのパラメーターの1つを使用して、テスト中であることをユーザーに知らせることができます。

私がテストしているときだけ、コードにこのパラメーターを設定したいと思います。現在、私はリリースビルドを実行するときにコードをコメント化しています。

ビルド構成に基づいてこれを自動的に行う方法はありますか?

36
Ronnie Overby

ソリューション

次のいずれかを使用できます。

1:Conditional属性

Conditional 属性は、指定された条件付きコンパイルシンボルが定義されていない限り、メソッド呼び出しまたは属性を無視する必要があることをコンパイラーに示します。

コード例:

[Conditional("DEBUG")]
static void Method() { } 

2:#ifプリプロセッサディレクティブ

C#コンパイラが #ifプリプロセッサディレクティブ に遭遇すると、最終的に#endifディレクティブが続き、指定されたシンボルが定義されている場合にのみ、ディレクティブ間のコードをコンパイルします。 。 CおよびC++とは異なり、シンボルに数値を割り当てることはできません。 C#の#ifステートメントはブール値であり、シンボルが定義されているかどうかのみをテストします。

コード例:

#if DEBUG
    static int testCounter = 0;
#endif 

3:Debug.Writeメソッド

Debug.Write (および Debug.WriteLine )は、デバッグに関する情報を Listeners コレクションのトレースリスナーに書き込みます。

Debug.WriteIf および Debug.WriteLineIf も参照してください。

コード例:

Debug.Write("Something to write in Output window.");

ノート

#ifディレクティブは、デバッグ以外のリリース(リリースなど)ビルドで意図しない状況を引き起こす可能性があるため、使用には注意してください。たとえば、次を参照してください。

    string sth = null;
#if DEBUG
    sth = "oh, hi!";
#endif
    Console.WriteLine(sth);

この場合、非デバッグビルドは空白のメッセージを出力します。しかし、これは別のケースでNullReferenceExceptionを発生させる可能性があります。

続きを読む

こちらもご覧ください

外部アプリケーションからデバッグ情報を取得できるツール DebugView もあります。

96

はい、コードをラップします

#if DEBUG
// do debug only stuff 
#else
// do non DEBUG stuff
#endif

Google for "C#コンパイルシンボル"

デバッグ構成では、Visual Studioが自動的にDEBUGを定義します。必要なシンボルを定義できます(プロジェクトのプロパティ、[ビルド]タブを見てください)。プリプロセッサディレクティブを悪用することは悪い考えであることに注意してください。コードの読み取りや保守が非常に困難になる可能性があります。

31
Matt Greer

私はこれと同じ問題を抱えていて、私が行った解決策は次のものを使用しています:

if (System.Diagnostics.Debugger.IsAttached)
{
    // Code here
}

つまり、技術的には本番環境でデバッガを接続して、そのコードを実行することができます。

15
James Hulse

#if #endifディレクティブに加えて、条件付き属性も使用できます。属性でメソッドをマークした場合

[Conditional("Debug")]

アプリケーションがデバッグモードでビルドされている場合にのみ、コンパイルおよび実行されます。以下のコメントで述べたように、これらはメソッドにvoid戻り型がある場合にのみ機能します。

7
George Johnston

同様の結果を持つ別の投稿があります: http://www.bigresource.com/Tracker/Track-vb-lwDKSoETwZ/

より良い説明は次の場所にあります: http://msdn.Microsoft.com/en-us/library/4y6tbswk.aspx

// preprocessor_if.cs
#define DEBUG
#define MYTEST
using System;
public class MyClass 
{
    static void Main() 
    {
#if (DEBUG && !MYTEST)
        Console.WriteLine("DEBUG is defined");
#Elif (!DEBUG && MYTEST)
        Console.WriteLine("MYTEST is defined");
#Elif (DEBUG && MYTEST)
        Console.WriteLine("DEBUG and MYTEST are defined");
#else
        Console.WriteLine("DEBUG and MYTEST are not defined");
#endif
    }
}
3
Edward Leno

以下は安全に使用できます。

var isDebug = false;
#if DEBUG
    isDebug = System.Diagnostics.Debugger.IsAttached;
#endif

if (isDebug) {
    // Do something
}
2
Jason Williams
public int Method ()
{
#if DEBUG 
   // do something 
#endif
}
2
David_001

これはasp.netで機能します。

if (System.Web.HttpContext.Current.IsDebuggingEnabled)
    //send email to developer;
else
    //send email to customer;

rick Strahl @から Detecting-ASPNET-Debug-mode

0
JerryOL