2

コードを書くとき、コードにデバッグ メッセージを挿入することがよくあります。デバッグ メッセージはロガー クラスによって処理されます。ロガー クラスは、デバッグ モードでメッセージをファイルに出力し、リリース モードでそれらを破棄します。

次のようになります。

class Logger : IDisposable
{
    private StreamWriter m_Logger = null;

    public void Start(string logFile)
    {
        m_Logger = new StreamWriter(logFile);
        m_Logger.AutoFlush = true;
    }

    public void Dispose()
    {
        if (m_Logger != null) m_Logger.Dispose();
    }

    public void WriteLine(string message)
    {
        if (m_Logger != null) m_Logger.WriteLine(message);
    }
}

インスタンスは起動時に作成され、Programクラスからアクセスできます。次に、次のようにデバッグを確認します。

#if DEBUG
Program.Log.Start("app.log");
#endif

これは、デバッグ モードではデバッグ情報をダンプし、リリース モードではダンプしないという点で、うまく機能します。ただし、 などのユーティリティを使用してリリースの実行可能ファイルを実行するとstrings、デバッグ文字列が表示されます。リバースエンジニアリングを防ぐために、リリースビルドから完全に除外したいと思います。

これまでに見つけた唯一の解決策は、すべてのデバッグ メッセージをプリプロセッサ条件でラップすることです。

// < some code here >
#if DEBUG
Program.Log.WriteLine("Some debug message.");
#endif
// < more code here >

これはかなり退屈で醜いです。私が最初に考えたのは、ある種のプリプロセッサ マクロを使用することでしたが、C# はそれらをサポートしていません。現在使用しているソリューションよりもエレガントなソリューションはありますか?

4

2 に答える 2

6

各 WriteLine 呼び出しで #if-#endif を使用しないようにするには、ロガー メソッド自体でConditionalAttributeを使用してみてください。

[Conditional("DEBUG")]
public void WriteLine(string message)
{
    if (m_Logger != null) m_Logger.WriteLine(message);
}

リリース ビルドの場合、これは MSIL から除外されます。

ConditionalAttribute をメソッドに適用すると、ConditionalAttribute に関連付けられている条件付きコンパイル シンボルが定義されていない限り、メソッドの呼び出しを Microsoft Intermediate Language (MSIL) にコンパイルする必要がないことがコンパイラに示されます。ConditionalAttribute を属性に適用すると、条件付きコンパイル シンボルが定義されていない限り、属性をメタデータに発行しないことを示します。

于 2012-06-13T13:55:43.853 に答える
0

1) #ifdef をログ メソッドの本体内に配置して、すべてのログ メッセージの周りに定義を配置する必要がないようにします。

2) リバース エンジニアリングを防止しようとしている場合は、文字列を暗号化するコードを難読化しますが、これはフェイルセーフではありません。

3) PostSharp のようなものを使用して、事後に MSIL からコードを積極的に削除することができますhttp://www.sharpcrafters.com/solutions/logging

于 2012-06-13T13:56:53.073 に答える