在运行时为特定方法创建调用图

时间:2011-06-17 20:04:47

标签: c# reflection

假设您有两个简单的接口及其方法:


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

当一个类实现ISerializable时,我希望能够知道对IValueWriter实现中的ISerializable.Serialize(IValueWriter writer)进行了哪些调用,并从中生成调用图。所有这些都需要在运行时使用反射和完成而不调用Serialize方法,并且它也将在我无法控制的类上完成,只要它们内部的代码可以进行。< / p>

示例:


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

如何以一种干净整洁的方式实现这一目标? 我真正的目标基本上是在接口方法的特定实现中进行的MethodInfo[]调用。

2 个答案:

答案 0 :(得分:0)

最干净的方式是AOP。 看看PostSharp

您需要做的就是创建一些属性并将它们添加到您的方法中,进行记录等。

据我所知,他们在编译后操纵IL。

答案 1 :(得分:0)

是的,你可以使用反射来做到这一点。当所分析的代码都没有运行时,我不会把它称为“运行时”。

  1. 迭代程序集中的所有类型。
  2. 过滤实施ISerializable
  3. 的类型
  4. 找到实施ISerializable.Serialize
  5. 的方法
  6. 获取IL
  7. 查找callvirt指令,其中方法令牌与IValueWriter中的方法匹配。
  8. 有一个开源项目ILSpy,它应该是如何解码IL指令并寻找方法调用的一个很好的例子。