Внедрение кода выполнения using DynamicMethod?

Рассмотрим следующий тривиальный код:

using System;   
class Test
{
    delegate int FooDelegate(int i);
    FooDelegate Foo = FooImplementation;
    static int FooImplementation(int i)
    {
        return i + 1;
    }

    public static void Main()
    {
         Foo(1);
    }
}

Я хотел бы ввести некоторый код отладки в делегат Foo, что было бы эквивалентно:

FooDelegate Foo = delegate(int i)
{
    try
    {
        DebugPrologue();
        return FooImplementation(i);
    }
    finally
    {
        DebugEpilogue();
    }
};

Поворот в что я должен быть в состоянии сделать это во время выполнения , поэтому о методах времени компиляции и постобработки не может быть и речи.

Мой первоначальный подход использовал Delegate.Combine () для добавления пролога и эпилога методы делегату Foo. Увы, это не сработает, поскольку меняет возвращаемые значения.

Моя текущая идея - использовать System.Reflection.Emit и DynamicMethod в качестве потенциального решения. Насколько я могу судить, мне нужно получить MethodInfo для FooImplementation, получить его MethodBody, преобразовать его в DynamicMethod и ввести в него свой блок try-finally.

К сожалению, я совершенно не знаю, как это сделать. Кто-нибудь готов протянуть руку помощи? Или у вас есть другая (желательно более простая) идея?

Изменить: здесь вариант использования - отладка привязки OpenGL (http://www.opentk.com). Мы должны внедрить 2226 методов с совершенно разными параметрами, поэтому необходим общий подход.

5
задан The Fiddler 4 December 2010 в 23:25
поделиться