Considere el siguiente código trivial:¿Inyección de código de tiempo de ejecución utilizando 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);
}
}
Lo que me gustaría hacer es inyectar algo de código de depuración en el delegado de Foo, lo que sería equivalente:
FooDelegate Foo = delegate(int i)
{
try
{
DebugPrologue();
return FooImplementation(i);
}
finally
{
DebugEpilogue();
}
};
El giro es que debo estar capaz de hacer esto en runtime, por lo que los métodos de tiempo de compilación y posprocesamiento están fuera de la cuestión.
Mi enfoque inicial usó Delegate.Combine() para agregar los métodos de prólogo y epílogo al delegado de Foo. Por desgracia, esto no funcionará ya que genera valores de retorno.
Mi idea actual es utilizar System.Reflection.Emit y DynamicMethod como una posible solución. Por lo que puedo decir, necesito obtener MethodInfo for FooImplementation, obtener su MethodBody, convertir eso en un DynamicMethod e inyectar mi bloque try-finally en eso.
Lamentablemente, no tengo ni idea de cómo hacerlo. ¿Alguien dispuesto a echar una mano? ¿O tienes otra idea (preferiblemente más simple)?
Editar: el caso de uso aquí está depurando un enlace OpenGL (http://www.opentk.com). Tenemos que inyectar 2226 métodos con parámetros muy diferentes, por lo que es necesario un enfoque general.
Esta solución funciona perfectamente para una cantidad manejable de métodos para inyectar. Desafortunadamente, en este caso específico, tengo que inyectar 2226 métodos con parámetros muy diferentes (esto es un enlace OpenGL, actualizaré la pregunta original para reflejar esto). –