コードを変更せずに C# メソッド呼び出しを監視する
問題:
クラスのパブリック インターフェイスを変更したり、外部 AOP フレームワークを使用したりせずに、メソッド シグネチャやパラメーター値を含む C# メソッド呼び出しを追跡およびログに記録するにはどうすればよいですか?
アプローチ:
コードを変更せずに C# でメソッド呼び出しを直接インターセプトすることは、組み込みの AOP 機能が制限されているため困難です。 以下に 2 つの潜在的な解決策を示しますが、それぞれに制限があります:
1.カスタム属性インターセプト:
MarshalByRefObject
または ContextBoundObject
を利用して、IMessageSink
を実装するカスタム属性を作成できます。この属性をメソッドに適用すると、呼び出しがインターセプトされます。 ただし、この方法ではパフォーマンスに重大なオーバーヘッドが発生します (10 倍の速度低下の可能性があります)。
2.ランタイムコード操作 (リフレクション):
リフレクションにより、ターゲット メソッドへのロギング コードのランタイム インジェクションが可能になります。 このアプローチにはリフレクションに関する高度な知識が必要であり、非常に侵襲的です。 さらに、Reflection.Emit
を使用して既存のメソッドを変更することは、すべての場合に実行可能であるとは限りません。
重要な要素:
Caller.Call
) を直接変更してロギングを含めることは、よりシンプルでパフォーマンスの高いソリューションとなる可能性があります。以上がクラスを変更したり、AOP ライブラリを使用したりせずに、C# メソッド呼び出しをインターセプトしてログに記録するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。