9

インストルメンテーションは、トレースとデバッグを可能にするメソッドにトレースコードを動的に追加する手法であることを私は知っています。

これが単なる「トレース」オプションであるのか、トレースコードのみを追加するためにCLRにハードコードされているのか、それともメソッドにコードを追加する機能があるのか​​、疑問に思いました。

たとえば、特定のクラスのすべてのメソッド呼び出しの最初の条件をチェックしたいと思います(たとえば、パーミッションの場合)。実行時にメソッドの先頭に動的コードを追加することでこれを行うことはできますか?

このトレースの「計装」がどのように機能するかはわかりませんが、これを他の目的にも使用できるかどうか疑問に思っています。

4

5 に答える 5

4

基本的には、CLRプロファイラーを作成し、c++でプロファイラーAPI
を使用 する必要があります。ICorProfilerCallbackインターフェイスを実装する必要があります。
探しているのはJITCompilationStartedコールバックです。このメソッドは、マネージドメソッドが呼び出されるたびに、jitコンパイラがILをマシンコードにコンパイルする前に呼び出されます。実行時のコード挿入作業は、JITCompilationStartedで行う必要があります。その方法の例として
、オープンソースカバレッジツールのパーツカバーを見ることができます。

于 2010-03-20T05:12:32.183 に答える
3

あなたはアスペクト指向プログラミング(AOP)を参照しています。

PostSharpをご覧ください。

また、C#のオープンソースアスペクト指向フレームワーク

于 2010-03-17T11:48:39.863 に答える
2

他の人が答えているように、そのような横断的関心事はしばしばアスペクト指向プログラミング(AOP)で対処されます。

AOPを実行する1つの方法は、PostSharpなどのツールを使用したコードインストルメンテーションを使用することですが、追加のツールを必要としない代替手段は、依存性注入(DI)とデコレーターデザインパターンを利用することです。

あなたのコードがIFooインターフェースを消費すると想像してください:

public interface IFoo
{
    string GetStuff(string request);
}

IFooの具体的な実装があるかもしれませんが、MyFooさまざまな側面を処理する1つまたは複数のデコレータを作成することもできます。

public class AdministratorGuardingFoo : IFoo
{
    private readonly IFoo foo;

    public AdministratorGuardingFoo(IFoo foo)
    {
        if (foo == null)
        {
            throw new ArgumentNullException("foo");
        }

        this.foo = foo;
    }

    public string GetStuff(string request)
    {
        new PrincipalPermission(null, "Administrator").Demand();

        return this.foo.GetStuff(request);            
    }
}

これで、(DIコンテナを)ラップすることができMyFooますAdministratorGuardingFoo。消費するすべての消費者IFooは違いに気付かないでしょう。

于 2010-03-17T12:00:52.033 に答える
0

PostSharpを使用すると、属性を使用して既存のメソッドに「アスペクト」を追加できるため、メソッドに開始/終了トレースを追加できます。

于 2010-03-17T11:48:05.957 に答える
0

CLRを使用すると、メッセージシンクを介したメソッドの傍受が可能になります。

于 2010-03-17T12:19:13.777 に答える