質問

溶液物性、構成設定"スリリース"私の一つに限ります。

初の日常に、私はこのコードで表示モードのデバッグ".またこれら二つのラインであり、私たちの誇りでもあり:

#define DEBUG 
#define RELEASE

私試験の権利変?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

私の目標は、設定の異なるデフォルトの変数に基づくデバッグのリリースvsモードになります。

役に立ちましたか?

解決

あなたのコード内で#define DEBUGを削除します。その特定のビルドのビルド構成でセットプリプロセッサ(DEBUG / _DEBUGが既にVSで定義する必要があります)。

それは「モード=デバッグ」を印刷します理由は、あなたの#defineのものであり、その後elifをスキップします。

また、チェックする正しい方法はあります:

#if DEBUG
    Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif

RELEASEをチェックしないでください。

他のヒント

プロジェクトはデバッグモードでコンパイルされ、それがリリースモードでいた場合、それを定義していない場合は、

はデフォルトでは、Visual StudioはDEBUGを定義します。 RELEASEは、デフォルトでリリースモードで定義されていません。使用このような何かます:

#if DEBUG
  // debug stuff goes here
#else
  // release stuff goes here
#endif

あなたが唯一のリリースモードで何かをしたい場合:

#if !DEBUG
  // release...
#endif

また、それの価値は、あなたがリターン[Conditional("DEBUG")]は、特定のシンボルが定義されている場合は、それらにのみ実行持っているという方法でvoid属性を使用することができることを指摘。シンボルが定義されていない場合、コンパイラはそれらのメソッドに対するすべての呼び出しを削除します。

[Conditional("DEBUG")]
void PrintLog() {
    Console.WriteLine("Debug info");
}

void Test() {
    PrintLog();
}

私は#defineを探し対このようにそれをチェックすることを好むます:

if (System.Diagnostics.Debugger.IsAttached)
{
   //...
}
else
{
   //...
}

もちろん、あなたがコンパイルでき、デバッグモードでデプロイ何かが、それでも、デバッガが取り付けられていないことを警告してます。

私はそれはあなたのデバッグがパスを構築するが、リリースは注意しないなら失敗のビルドの問題を与えるようすべてのあなたのコードベースの周りに広がっている場合は特に、#ifのものの巨大なファンではない。

だからここに私が思い付く持っているものです(の#ifdefに触発A>):

public interface IDebuggingService
{
    bool RunningInDebugMode();
}

public class DebuggingService : IDebuggingService
{
    private bool debugging;

    public bool RunningInDebugMode()
    {
        //#if DEBUG
        //return true;
        //#else
        //return false;
        //#endif
        WellAreWe();
        return debugging;
    }

    [Conditional("DEBUG")]
    private void WellAreWe()
    {
        debugging = true;
    }
}
bool isDebug = false;
Debug.Assert(isDebug = true); // '=', not '=='

の方法 Debug.Assert は、条件付属性 DEBUG.の場合は定義されていないの の課題 isDebug = true:

場合には記号の定義には含まれてそうしないと、電話を含むの評価パラメータの呼び出しの)省略しております。

の場合 DEBUG が定義される isDebug 設定 true (渡される Debug.Assert なものではないこと。

あなたは2つの行を削除する必要があり、ビルドタイプに定義された変数を使用しようとしている場合...

#define DEBUG  
#define RELEASE 

...これらは常に真であることが、のの#if(DEBUG)の原因となります。

また、のRELEASE のためのデフォルトの条件付きコンパイルシンボルはありません。あなたは、プロジェクトのプロパティに一度を定義したい場合は、のビルドのタブをクリックし、の条件付きコンパイルシンボルのテキストボックスの下にの一般的なの見出します。

他のオプションは、この操作を行うことであろう...

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif

タグトップであなたの定義を削除します
#if DEBUG
        Console.WriteLine("Mode=Debug"); 
#else
        Console.WriteLine("Mode=Release"); 
#endif
静的関数ではなく、別のクラスとしてトッド・トムソン答えの

わずかに変更された(bastardized?)バージョンは、(私はすでに含まれていたI viewutilsクラスからviewbinding Webフォームでそれを呼び出すことができると思いました)。

public static bool isDebugging() {
    bool debugging = false;

    WellAreWe(ref debugging);

    return debugging;
}

[Conditional("DEBUG")]
private static void WellAreWe(ref bool debugging)
{
    debugging = true;
}

名前空間の

using System.Resources;
using System.Diagnostics;

メソッド

   private static bool IsDebug()
    {
        object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false);
        if ((customAttributes != null) && (customAttributes.Length == 1))
        {
            DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute;
            return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled);
        }
        return false;
    }

プロジェクトのビルドプロパティでDEBUG定数を定義してください。これは#if DEBUGを可能にします。それがないDEBUGブロックにその何かを暗示することができるように、私はRELEASEモードで、事前定義されたRELEASE定数が表示されません。

あなたに多くの時間を節約することがあり、先端は - 十分ではありません - あなたはビルド構成(vs2012 / 13メニューで、それはBUILD =>構成マネージャの下にあります)の下でdebugを選択した場合でもそれを忘れないでください。

あなたのような、PUBLISH Configurationに注意を払うに必要

ここに画像の説明を入力します

これらのコンパイラディレクティブの目的は、これらの広告部門を言っている場合を除き、コード、デバッグコード、ベータコード、またはエンドユーザーのすべてが必要とするかもしれないコードを含まないコンパイラに指示しているので、すなわちの#define AdDeptあなたは、またはあなたのニーズに基づいてそれらを削除できるようにしたいです。 AdDeptにあれば、たとえば非AdDeptのマージをあなたのソースコードを変更せずに。そして、すべてのニーズが行われることは、プログラムの既存のバージョンのコンパイラオプションのプロパティページで#AdDeptディレクティブを含めると、コンパイルを行うことで、WAラ!プログラムのコードは生きている!スプリングマージされます。

また、プライムタイムの準備ができていないか、それはそれを解放するためにそれの時間までのコードでアクティブにすることはできません新しいプロセスのための宣言型を使用する場合があります。

いずれにせよ、それは私がそれを行う方法です。

私はより良い方法を考えるになりました。

;これは、(ただし、任意のシンボルと真DEBUGまたはRELEASEを想定して)ブロックの#if効果的に他の構成ではコメントであることを私に夜が明けました
public class Mytest
    {
        public DateTime DateAndTimeOfTransaction;
    }

    public void ProcessCommand(Mytest Command)
        {
            CheckMyCommandPreconditions(Command);
            // do more stuff with Command...
        }

        [Conditional("DEBUG")]
        private static void CheckMyCommandPreconditions(Mytest Command)
        {
            if (Command.DateAndTimeOfTransaction > DateTime.Now)
                throw new InvalidOperationException("DateTime expected to be in the past");
        }

の定義を削除し、条件がデバッグモードであるかどうかを確認します。あなたはディレクティブがリリースモードであるかどうかを確認する必要はありません。

このような何かます:

#if DEBUG
     Console.WriteLine("Mode=Debug"); 
#else
    Console.WriteLine("Mode=Release"); 
#endif
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top