Estoy usando System.Reflection.Emit por un tiempo y lo encuentro (¿quién no?) Tan doloroso como propenso a errores.¿Hay una buena envoltura alrededor de ILGenerator?
¿Sabes si hay una buena envoltura alrededor del IL Generator, algo en lo que puedo confiar para emitir IL de una manera más segura y más fácil que con jugar directamente con SRE?
Editar:
sé que la manipulación de los árboles de expresión es definitivamente más fácil y más seguro que el emisor de IL directamente, pero también tienen algunas limitaciones en este momento. No puedo crear bloques de código, usar bucles, declarar y trabajar con varios locales, etc. Tenemos que esperar hasta que aparezca .NET 4 :)
Además, estoy tratando con una base de código que ya se basa en SRE.
Obviamente, ILGenerator hace todo lo que necesito. Pero agradecería más ayuda al manipularlo. Cuando me refiero a una envoltura ILGenerator, que se mantiene a un nivel bastante bajo, pienso en algo que podría proporcionar métodos como:
// Performs a virtual or direct call on the method, depending if it is a
// virtual or a static one.
Call(MethodInfo methodInfo)
// Pushes the default value of the type on the stack, then emit
// the Ret opcode.
ReturnDefault(Type type)
// Test the object type to emit the corresponding push
// opcode (Ldstr, Ldc_I*, Ldc_R*, etc.)
LoadConstant(object o)
Es realmente 3 ejemplos ingenuas, pero podría ser suficiente para demostrar lo que esperar. Podemos verlo como un conjunto de métodos de extensión, pero podría ser útil tener soporte para sentencias condicionales y bucles como en RunSharp. De hecho, RunSharp está bastante cerca de lo que quiero, pero abstrae demasiado el ILGenerator y no expone toda su funcionalidad.
No recuerdo dónde, pero ya vi tal ayudante en un proyecto de código abierto.
No ha especificado qué es lo que ILGenerator no hace, y qué 'buena' envoltura haría. –
Ese es un punto válido; Actualicé la pregunta para proporcionar más detalles. –
En realidad, como las Expresiones son expresiones lambda, debería poder usar el bucle, implementado como operador de recursividad + Y. – TraumaPony