C#の場合/その指示のためのデバッグvsリリース
-
21-09-2019 - |
質問
溶液物性、構成設定"スリリース"私の一つに限ります。
初の日常に、私はこのコードで表示モードのデバッグ".またこれら二つのラインであり、私たちの誇りでもあり:
#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 のためのデフォルトの条件付きコンパイルシンボルはありません。あなたは、プロジェクトのプロパティに一度を定義したい場合は、のビルドのタブをクリックし、の条件付きコンパイルシンボルのテキストボックスの下にの一般的なにRELEASEを追加em>の見出します。
他のオプションは、この操作を行うことであろう...
#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;
}
あなたに多くの時間を節約することがあり、先端は - 十分ではありません - あなたはビルド構成(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