2008-10-13 11 views
7

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.

+0

No ha especificado qué es lo que ILGenerator no hace, y qué 'buena' envoltura haría. –

+0

Ese es un punto válido; Actualicé la pregunta para proporcionar más detalles. –

+0

En realidad, como las Expresiones son expresiones lambda, debería poder usar el bucle, implementado como operador de recursividad + Y. – TraumaPony

Respuesta

6

Si está usando .NET 3.5, puede encontrar que usar Expression Trees es más razonable. Todo depende de lo que esté haciendo, y aún puede ser muy doloroso, pero sin duda es otra opción a tener en cuenta.

+0

Lamentablemente, todavía estoy con .NET 2.0. Podría usar la implementación Mono de la clase Expression, pero los árboles de expresiones no son capaces de manejar lo que pretendo hacer (bloques de código, varias asignaciones locales, etc.) –

+0

Los árboles de extensiones no son útiles cuando se implementan tipos complejos. Solo cuando se trabaja con métodos. –

4

[actualizado]: Pensé en el nombre ;-p RunSharp. No puedo responderlo, pero podría ser lo que necesitas.

Sin embargo; ¿Qué necesitas generar? CodeDom es una opción. Para la creación de métodos, puede encontrarse con que se puede hacer mucho más de lo esperado con la clase Expression en .NET 3.5 (después de la compilación a través de un delegado mecanografiado Expression.Lambda/compilar.

+0

Soy consciente de RunSharp, y estaba buscando algo así que se refiere a un nivel inferior. Prefiero mantenerme alejado de CodeDom, incluso si es una buena solución en muchos casos. Estoy atrapado con DynamicMethods la mayor parte del tiempo. –

+0

OK; pensamiento menor, pero podrías haber incluido esto (y tu requisito 2.0) en la pregunta original ... Re "nivel inferior" - ¿qué tipo de nivel (entre RunSharp e ILGenerator) estás buscando? –

+0

Tienes razón, agregué más información en la pregunta original. ¡Gracias por tu ayuda! –

2

Trate de usar Mono.Cecil

Cecil es una biblioteca escrita por Jb Evain para generar e inspeccionar los programas y las bibliotecas en el formato ECMA CIL. tiene soporte completo para los genéricos, y admite algún formato símbolo depuración.

Cuestiones relacionadas