Рассмотрим следующий тривиальный код:Ввод кода впрыска с использованием 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();
}
};
Твист является то, что я должен быть в состоянии сделать это на runtime, поэтому методы компиляции и пост-обработки не могут быть и речи.
Мой первоначальный подход использовал Delegate.Combine() для добавления методов пролога и эпилога в делегат Foo. Увы, это не сработает, так как он возвращает возвращаемые значения.
Моя нынешняя идея - использовать System.Reflection.Emit и DynamicMethod в качестве потенциального решения. Насколько я могу судить, мне нужно получить MethodInfo для FooImplementation, получить его MethodBody, преобразовать его в DynamicMethod и вставить в него блок try-finally.
К сожалению, я не знаю, как это сделать. Любой, кто хочет протянуть руку? Или у вас есть другая (желательно более простая) идея?
Редактировать: прецедент здесь отлаживает привязку OpenGL (http://www.opentk.com). Мы должны вводить 2226 методов с совершенно разными параметрами, поэтому необходим общий подход.
Это решение прекрасно работает для приемлемого количества методов для инъекций. К сожалению, в этом конкретном случае я должен ввести 2226 методов с совершенно разными параметрами (это привязка OpenGL, я обновлю исходный вопрос, чтобы это отразить). – 2010-12-04 23:21:47