492

ソリューションのプロパティで、唯一のプロジェクトの構成を「リリース」に設定しています。

メインルーチンの最初にこのコードがあり、「Mode=Debug」と表示されています。また、一番上に次の2行があります。

#define DEBUG 
#define RELEASE

私は正しい変数をテストしていますか?

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

私の目標は、デバッグモードとリリースモードに基づいて、変数に異なるデフォルトを設定することです。

4

15 に答える 15

807

DEBUG/_DEBUGはすでにVSで定義されている必要があります。

コード内のを削除#define DEBUGします。その特定のビルドのビルド構成にプリプロセッサを設定します。

「Mode=Debug」と出力される理由は、のせいで、#defineをスキップするためelifです。

確認する正しい方法は次のとおりです。

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

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

于 2010-01-20T19:05:42.430 に答える
328

既定では、プロジェクトがデバッグモードでコンパイルされている場合、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();
}
于 2010-01-20T19:04:33.103 に答える
245

#defineディレクティブを探すよりも、このようにチェックする方が好きです。

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

もちろん、デバッグモードで何かをコンパイルしてデプロイすることはできますが、デバッガーを接続していないことに注意してください。

于 2010-01-20T19:09:59.907 に答える
59

私は #if の大ファンではありません。特に、コード ベース全体に #if を広めると、注意しないとデバッグ ビルドはパスしてもリリース ビルドが失敗するという問題が発生するためです。

だからここに私が思いついたものがあります(C#の #ifdef に触発されました):

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;
    }
}
于 2013-03-08T07:16:17.727 に答える
21

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

#define DEBUG  
#define RELEASE 

...これらにより、#if(DEBUG)が常にtrueになります。

また、 RELEASEのデフォルトの条件付きコンパイルシンボルはありません。プロジェクトのプロパティに移動して定義する場合は、[ビルド]タブをクリックし、[一般]見出しの下の[条件付きコンパイルシンボル]テキストボックスに[リリース]を追加します。

他のオプションはこれを行うことです...

#if DEBUG
    Console.WriteLine("Debug");
#else
    Console.WriteLine("Release");
#endif
于 2010-01-20T19:03:47.457 に答える
8

上部の定義を削除します

#if DEBUG
        Console.WriteLine("Mode=Debug"); 
#else
        Console.WriteLine("Mode=Release"); 
#endif
于 2010-01-20T19:07:10.773 に答える
7

NameSpace

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;
    }
于 2012-05-07T14:13:23.890 に答える
-1

これらの COMPILER ディレクティブの目的は、コード、デバッグ コード、ベータ コード、または広告部門などを除くすべてのエンド ユーザーが必要とするコードを含めないようにコンパイラに指示することです。必要に応じて、それらを含めたり削除したりできます。たとえば、非 AdDept が AdDept にマージされた場合、ソース コードを変更する必要はありません。あとは、既存のバージョンのプログラムのコンパイラ オプション プロパティ ページに #AdDept ディレクティブを含めて、コンパイルを実行するだけです。マージされたプログラムのコードが生き返ります!.

また、プライム タイムの準備ができていない新しいプロセスや、リリースするまでコード内でアクティブにできない新しいプロセスに対して宣言を使用することもできます。

とにかく、それは私がそれを行う方法です。

于 2013-09-14T22:46:35.793 に答える