Consultez le code trivial suivant:L'injection de code d'exécution à l'aide de 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);
}
}
Ce que je voudrais faire est d'injecter un code de débogage dans le délégué Foo, ce qui équivaudrait:
FooDelegate Foo = delegate(int i)
{
try
{
DebugPrologue();
return FooImplementation(i);
}
finally
{
DebugEpilogue();
}
};
La torsion est que je dois être capable de le faire à runtime, donc les méthodes de compilation et de post-traitement sont hors de question.
Mon approche initiale a utilisé Delegate.Combine() pour ajouter les méthodes prologue et epilogue au délégué Foo. Hélas, cela ne fonctionnera pas car cela permet d'obtenir des valeurs de retour.
Mon idée actuelle est d'utiliser System.Reflection.Emit et DynamicMethod comme solution potentielle. Pour autant que je sache, j'ai besoin de MethodInfo pour FooImplementation, obtenir son MethodBody, le convertir en DynamicMethod et y injecter mon bloc try-finally.
Malheureusement, je n'ai absolument aucune idée de comment faire cela. Quelqu'un est-il prêt à donner un coup de main? Ou avez-vous une autre idée (de préférence plus simple)? Edit: le cas d'utilisation ici est le débogage d'une liaison OpenGL (http://www.opentk.com). Nous devons injecter 2226 méthodes avec des paramètres très différents, donc une approche générale est nécessaire.
Cette solution fonctionne parfaitement pour un nombre traitable de méthodes à injecter. Malheureusement, dans ce cas précis, je dois injecter 2226 méthodes avec des paramètres extrêmement différents (c'est une liaison OpenGL, je vais mettre à jour la question originale pour refléter cela). –