.NET コンパイラ — デバッグとリリース
-
09-06-2019 - |
質問
私は何年もの間、VB.NET の DEBUG コンパイラ定数を使用して、コンソールにメッセージを書き込みてきました。私も同様の方法で System.Diagnostics.Debug.Write を使用しています。RELEASE がビルド オプションとして使用されると、これらのステートメントはすべてコンパイラーによって省略され、実稼働コードからデバッグ ステートメントのオーバーヘッドが解放される、というのが私の理解でした。最近、Silverlight 2 Beta 2 を使用しているときに、公開 Web サイトから実行していた RELEASE ビルドに Visual Studio が実際にアタッチされており、コンパイルすらされていないと思われる DEBUG ステートメントが表示されていることに気づきました。さて、私の最初の傾向は、私の環境に何か問題があると想定することですが、System.Diagnostics.Debug と DEBUG ビルド オプション全般について深い知識を持つ人に、私がここで誤解している可能性があることを尋ねたいと思います。
解決
推奨される方法は、コンパイラ ディレクティブを使用するのではなく、実際に条件属性を使用してデバッグ呼び出しをラップすることです。#ifs は扱いが難しく、ビルドに奇妙な問題が発生する可能性があります。
条件属性の使用例は次のとおりです (C# の場合ですが、VB.NET でも機能します)。
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
// do stuff
}
DEBUG フラグを設定せずにコンパイルすると、Debug.Write() で発生すると想定されていたため、WriteDebug への呼び出しはすべて削除されます。
他のヒント
私がやっているのは、Debug への呼び出しを独自のクラスにカプセル化し、プリコンパイラ ディレクティブを追加することです。
public void Debug(string s)
{
#if DEBUG
System.Diagnostics.Debug(...);
#endif
}
DEBUG コンパイラ シンボルを使用すると、あなたが言ったように、実際にはアセンブリからコードが省略されます。
リリース モードでビルドした場合でも、System.Diagnostics.Debug.Write は常に接続されたデバッガーに出力すると思います。ごとに MSDN の記事:
デバッグに関する情報を Listeners コレクションのトレース リスナーに書き込みます。
望まない場合は どれでも 出力では、Juan が言ったように、Debug.Write への呼び出しを DEBUG 定数でラップする必要があります。
#if DEBUG
System.Diagnostics.Debug.Write(...);
#endif
私もこの記事を読みましたが、DEBUG が定義されていない場合、System.Debug 関数で宣言された ConditionalAttribute によってコンパイラがこのコードを完全に除外するのではないかと考えるようになりました。TRACE についても同じことが当てはまると思います。つまり、System.Diagnostics.Debug 関数には、DEBUG と TRACE の ConditionalAttributes が必要です。その仮定は間違っていました。別の Trace クラスにも同じ関数があり、これらは TRACE 定数に応じて ConditionalAttribute を定義します。
System.Diagnostics.Debug から:_パブリック共有サブ書き込み(_ string _メッセージ_)
System.Diagnostics.Trace から:_パブリック共有サブライターライン(_メッセージとしてのメッセージ_)
System.Diagnostics.Debug (または system.Diagnostics.Trace) ステートメントは、#IF DEBUG (または #IF TRACE) 領域に含まれているかのように、実際にはコンパイルに含まれないという、私の最初の仮定が正しかったように思えます。
しかし、私はここで皆さんから学び、RELEASE ビルド自体ではこれに対処できないことも確認しました。少なくとも Silverlight プロジェクトの場合は、まだ不安定な部分があるため、「詳細コンパイル オプション...」を開いて、DEBUG が定義されていないことを確認する必要があります。
私たちは .NET 1.1/VS2003 から .NET 3.5/VS2008 に移行したため、以前は一部動作が異なっていたと思いますが、おそらく 2.0/VS2005 では変更されたと思われます。
デバッグ情報をコンパイルするか削除するかを選択するには、
プロジェクトのプロパティウィンドウの「ビルド」タブに入ります。
適切な構成(Active/Release/Debug/All)を選択し、情報が必要な場合は「デバッグ定数」を確認するか、そうでない場合はチェックしてください。
変更を適用して再構築する
私の経験では、VB.NET でデバッグとリリースのどちらを選択しても違いはありません。両方の設定にカスタム アクションを追加できますが、デフォルトでは同じであると思います。
Release を使用しても、System.Diagnostics.Debug.Write ステートメントは削除されません。