2011-06-17 16 views
1

ため、実行時にコールグラフを作成し、あなたが2つの簡単なインターフェースとそのメソッドがあるだろう:クラスIに行われた呼び出しを知ることができるようにしたいと思いISerializableを実装する場合は、具体的な方法


ISerializable.Serialize(IValueWriter writer) 
IValueWriter.WriteInt32(Int32 value) 
IValueWRiter.WriteInt64(Int64 value) 

ISerializable.Serialize(IValueWriter writer)実装内のIValueWriterを呼び出し、それからコールグラフを生成します。これらのすべては、リフレクションとを使用して実行時に行う必要があります。これはSerializeメソッドを呼び出すことなく行う必要があります。また、クラス内でコードを制御することはできません。

例:


public sealed class SomeObject : ISerializable 
{ 
    private readonly Int32 first; 
    private readonly Int64 second; 

    public SomeObject(Int32 first, Int64 second) 
    { 
     this.first = first; 
     this.second = second; 
    } 

    public void Serialize(IValueWriter writer) 
    { 
     writer.WriteInt32(this.first); 
     writer.WriteInt64(this.second); 
    } 
} 

コールグラフは次のようになります。


SomeObject -> Serialize | -> IValueWriter.WriteInt32 
         | -> IValueWriter.WriteInt64 

どのように1は、きれいな方法でこれを実現するのでしょうか? 私が本当に目指しているのは基本的に、インターフェイスメソッドの特定の実装で行われた呼び出しのMethodInfo[]です。

答えて

0

はい、これは反射を使用して行うことができます。分析されているコードのどれもが実行されていないとき、私は実際にそれを「ランタイム」と呼びません。

  1. アセンブリ内のすべてのタイプを繰り返します。
  2. ISerializable.Serialize
  3. 方法トークンがIValueWriter内の方法と一致するcallvirt手順については、IL
  4. ルックフェッチを実装する方法を探すISerializable
  5. を実装するタイプに対応するフィルタ。

IL命令をデコードしてメソッド呼び出しを探す方法の良い例になるはずのオープンソースプロジェクトILSpyがあります。

+0

私はこれをちょっと解読した後にこれを理解しました。基本的に正しいです。私は基本的にMethodInfoをTypeから取り出し、MethodBodyとMethodInfo.GetMethodBodyで再生しました。 OpCode構造のOpCodesフィールドを反映させて、それぞれの構造に数値をデコードする逆ルックアップテーブルを作成しました。私はあなたの答えを解決策にしておきますが、それは私が平均して発見したものだからです。 –

0

最もクリーンな方法はAOPです。 PostSharp

あなたがする必要があるのは、いくつかの属性を作成し、あなたの方法にそれらを追加することであるのを見て、

は、私の知る限り、彼らは、コンパイル後にILを操作するなど、ログに記録されます。

+0

実際の実行に先立ってメソッドを分析し、コールグラフを作成する必要があります。残念ながら、これは動作しません。 –

+0

"実際の実行に先立ってメソッドを分析し、コールグラフを作成する必要があります。"これが正確に行われます。 MethodStartAttributeを持つメソッドを呼び出すと、コードが呼び出されます –

+0

PostSharpはここでは役に立ちません。はい、それはあなたのAOPを織りますが、コンパイル時コールグラフ解析のために何もしません。 – Amy

関連する問題