Сделать график вызовов во время выполнения для конкретного метода - PullRequest
1 голос
/ 18 июня 2011

Скажем, у вас есть два простых интерфейса и их методы:


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

Когда класс реализует ISerializable, я бы хотел знать, какие вызовы сделаны для IValueWriter внутри реализации ISerializable.Serialize(IValueWriter writer), и сгенерировать граф вызовов из этого. Все это должно быть сделано во время выполнения с использованием отражения и без вызова метода 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

Как можно было бы сделать это красиво и чисто? То, к чему я действительно стремлюсь, это в основном MethodInfo[] вызовов, сделанных в конкретной реализации метода интерфейса.

Ответы [ 2 ]

0 голосов
/ 18 июня 2011

Да, вы можете сделать это с помощью отражения. Я бы не стал называть это «временем выполнения», когда не выполняется ни один из анализируемого кода.

  1. Перебор всех типов в сборке.
  2. Фильтр для типов, реализующих ISerializable
  3. Найдите метод, реализующий ISerializable.Serialize
  4. Получить IL
  5. Найдите callvirt инструкции, в которых токен метода соответствует методу в IValueWriter.

Есть проект с открытым исходным кодом, ILSpy, который должен стать хорошим примером того, как декодировать инструкции IL и искать вызовы методов.

0 голосов
/ 18 июня 2011

самым чистым способом является АОП.взгляните на PostSharp

Все, что вам нужно сделать, - это создать некоторые атрибуты и добавить их к вашим методам, для регистрации и т. д.

, насколько мне известно.знаю, что они манипулируют IL после компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...