1

VS 2010 C# で Windows アプリケーションを作成します。これは Web クローラー アプリケーションであり、N 層アプリケーション構造 (このプロジェクトでは 1 つの Windows アプリケーションと多くのクラス ライブラリ) を使用します。先週、パフォーマンスの問題を解決するためのログ テキストを作成するために、すべてのプロジェクトにログ システムを実装しました。しかし、リリースモードでこのログ機能を無効にしたいと思います。

私はググって CodeProjectから例を取得しました。以下の私のコードを見てください。

public class ModeDetector
{
    public virtual bool IsDebug
    {
        get
        {
            bool isDebug = false;

            #if (DEBUG)
            isDebug = true;
            #else
            isDebug = false;
            #endif

            return isDebug;
        }
    }

    public bool IsRelease
    {
        get { return !IsDebug; }
    }
}

このクラスは、基本クラス ライブラリに作成します。すべての参照プロジェクトに対してこのクラスを取得します。Windows アプリケーションでこのメソッドを呼び出します。お気に入り

if (new Sun.lib.ModeDetector().IsDebug)
            MessageBox.Show("Debug Mode");
        else
            MessageBox.Show("Release Mode");

プロジェクトのビルド構成を「リリース」に変更します。ただし、このコードは常に「デバッグ モード」メッセージを表示します。しかし、Windows アプリケーションでこのクラスを作成すると、正常に動作します。しかし、すべてのプロジェクトでこのクラスを作成するのは心配です。

プロジェクトが作業デバッグまたはリリース モードであるかどうかを判断するためのベスト プラクティスを教えてください。プロジェクト全体でこのクラスを使用するにはどうすればよいですか。

編集:

クラス ライブラリ プロジェクトの Debug bug フォルダにあるクラス ライブラリを参照します。

私のクラス ライブラリと勝利フォーム アプリケーションは、同じソリューション上にあります。

4

3 に答える 3

1

ほとんどの場合、Debug.XXXXメソッドで使用されるものと同様の条件付き属性を再発明しようとしています。条件付き属性により、指定されたシンボルが定義されていない場合、メソッド呼び出しをノーオペレーションにすることができます。

つまり、デバッグ ビルドでトレースしている Debug.Write メソッド (定義されている場合)とリリースでノーオペレーションを見てくださいDEBUG

[ConditionalAttribute("DEBUG")]
public static void Write(Object value)

条件付き属性を持つメソッドが呼び出されるか、条件付きシンボルに依存しないため、必要な仮想関数を実装できないことに注意してください。ただし、メソッド内のコードは変わりません。

#ifコンパイルされるコードを変更します。コンパイルされた DLL には、(条件に一致する) 1 つの分岐しかありません。

リリース ビルドとデバッグ ビルドでは、一致するライブラリを参照する必要があります。すべてのプロジェクトに単一のソリューションを使用している場合は自動的にセットアップされます。個別のソリューションがある場合は、「.csproj」ファイルを手動で編集して、定義に応じて異なるバージョンのライブラリを含める必要があると思います。

于 2013-08-15T08:07:24.820 に答える
1

フラグは、DEBUGソリューションごとではなく、ライブラリごとに設定されます。ソリューションで使用するすべてのライブラリでそのフラグを設定 (または削除) する必要があります。

于 2013-08-15T08:03:13.840 に答える