2008-08-26 17 views
18

私はVB.NETでDEBUGコンパイラ定数を使用して、コンソールにメッセージを書きました。私はSystem.Diagnostics.Debug.Writeも同様の方法で使用しています。 RELEASEがビルドオプションとして使用されたとき、これらのステートメントはすべてコンパイラによって除外され、デバッグステートメントのオーバーヘッドの実動コードが解放されることは、常に私の理解であった。最近、Silverlight 2 Beta 2を使用しているときに、Visual Studioが公開ビルドに実際に添付されていることに気付きました。公開されたWebサイトから実行していて、コンパイルされていないDEBUGステートメントが表示されました。さて、私の最初の考えは、自分の環境に何か問題があると仮定することですが、System.Diagnostics.DebugとDEBUGビルドオプションに関する深い知識を持つ人には、私がここで誤解しているかもしれないことを一般に尋ねたいと思っています。.NETコンパイラ - DEBUG vs. RELEASE

答えて

21

の好ましい方法は、実際にありますconditional属性を使用してデバッグ呼び出しをラップし、コンパイラ指令を使用しないでください。 #ifsは扱いにくく、奇妙なビルドの問題につながる可能性があります。

条件属性の使用例次のように(C#で、あまりにもVB.NETで動作します)です:

[ Conditional("Debug") ] 
private void WriteDebug(string debugString) 
{ 
    // do stuff 
} 

あなたはDEBUGフラグを設定せずにコンパイルすると、WriteDebugへの呼び出しが削除されますDebug.Write()で起こっていたと仮定した。

+0

驚くばかり...新しい小さなトリックを学ぶのが大好き! – BigBlondeViking

+1

私は 'ConditionalAttribute'を使うと、メソッドがまだ実際のリリースアセンブリの一部であり、ロードされていないことを意味すると思いますので、デバッグコードを削除する唯一の真の方法はコンパイラ指令を使うことです。 – James

-6

私の経験では、VB.NETでのデバッグとリリースの選択に違いはありません。両方の設定にカスタムアクションを追加することができますが、デフォルトでは同じものだと思います。

リリースを使用すると、確実にSystem.Diagnostics.Debug.Writeステートメントは削除されません。私は何

+0

これらは同じではありません。既定で解放モードは、メソッドに適用されたConditionalAttributeのためにDebug.Writeへの呼び出しを実際に削除します。 –

1

は自分のクラスにデバッグの呼び出しをカプセル化し、DEBUGコンパイラの記号を使用してプリコンパイラ・ディレクティブ

public void Debug(string s) 
{ 
#if DEBUG 
    System.Diagnostics.Debug(...); 
#endif 
} 
1

を追加し、あなたが言ったように、実際のアセンブリからのコードを省略するあります。

リリースモードでビルドした場合でも、System.Diagnostics.Debug.Writeは常に添付されたデバッガに出力されると思います。 MSDN article

Listenersコレクションのトレースリスナーにデバッグに関する情報を書き込みます。

あなたがどんな出力したくない場合はファンが言ったように、あなたはDEBUG定数でDebug.Writeにお電話をラップする必要があります:

#if DEBUG 
    System.Diagnostics.Debug.Write(...); 
#endif 
1

私はDEBUGが定義されていないときに、System.Debug関数で宣言されたConditionalAttributeがこのコードを完全に除外してしまうと考えました。私はTRACEについても同じことを真実と仮定します。つまり、System.Diagnostics.Debug関数には、DEBUGとTRACEのConditionalAttributesが必要です。私はその前提で間違っていた。別のTraceクラスは同じ関数を持ち、TRACE定数に依存してConditionalAttributeを定義します。 System.Diagnostics.Debugから

: _ 公共の共有サブ書き込み(_ 文字列としてメッセージ_ )

たSystem.Diagnosticsから。トレース: _ 公共の共有サブWriteLineメソッド(文字列として_ メッセージ_ )

私の元の仮定がSystem.Diagnostics.Debug(またはsystem.Diagnostics.Trace)文は、実際にはないこと、正しいこと、次にようです#IF DEBUG(または#IF TRACE)領域に含まれているかのようにコンパイルに含まれます。

しかし、私もここから皆さんから学んだことがあります。また、RELEASEビルド自体がそれを処理していないことを確認しました。少なくともSilverlightプロジェクトではまだ少しばかりですが、 "Advanced Compile Options ..."に入り、DEBUGが定義されていないことを確認する必要があります。

私たちは.NET 1.1/VS2003から.NET 3.5/VS2008に飛びました。これはいくつかの違いがありましたが、おそらく2.0/VS2005で変更されたと思います。

5

Debug.Writeメソッドを調べます。

[Conditional("DEBUG")] 

という属性が付いています。

ConditionalAttribute状態のMSDNヘルプ:

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

ビルド構成にリリースまたはデバッグのラベルがあるかどうかは関係ありません。問題はDEBUGシンボルが定義されているかどうかです。あなたはデバッグ情報をコンパイルするか、削除するかどうかを選択するには

1

は、プロジェクトのプロパティウィンドウで「ビルド」タブを入力してください。

正しい設定(アクティブ/リリース/デバッグ/すべて)を選択し、 の情報が必要な場合は「DEBUG定数」をチェックし、そうでない場合はチェックを外してください。

変更を適用して再構築

関連する問題