2010-08-05 19 views
8

¿Cuál es la forma más fácil de recorrer una información de método en C#?Recorrer un método C# y analizar el cuerpo del método

Quiero recorrer el cuerpo del método y encontrar referencias de campo y tal y recuperar los tipos.

En System.Reflection existe:

mi.GetMethodBody().GetILAsByteArray() 

que es un poco de bajo nivel y requeriría "algo" de trabajo antes de que yo sería capaz de atravesar el cuerpo.

Sé que Cecil existe, pero hay un problema al cargar un ensamblaje en memoria con cecil. El ensamblaje con el que estoy trabajando no siempre está "en el disco", puede ser un conjunto de memoria compilado de, por ejemplo. Boo, y quiero una solución limpia sin escribiendo el ensamblaje temporal en el disco.

¿Qué otras alternativas hay para esto?

+0

¿Cuál es el problema con Cecil y los ensamblajes en memoria? –

+0

@Tim: encontré este http://markmail.org/message/yssmfgrsqnnnzrvt, es un poco viejo. No hay ningún método en AssemblyFactory para cargar un ensamblaje existente solo desde un archivo, byte [] o Stream. Intenté serializar un ensamblado generado por Boo en byte [] pero obtuve "Type System.Reflection.Emit.AssemblyBuilder no está marcado como Serializable". Tal vez estoy haciendo algo mal al recuperar un byte [] de un ensamblaje. – Marcus

Respuesta

7

Esto debería ayudar: Reflection based CIL reader. Funciona en una matriz de bytes obtenida llamando a GetILAsByteArray()

+0

Gracias, eso debería hacerlo. Debe haber perdido ese cuando se buscó en Google una solución. – Marcus

+1

Al menos buscó en Google antes de preguntar. No como muchos aquí en el sitio ;-) –

+0

Si alguien del mono-equipo está leyendo esto, hay un error o algo en el tiempo de ejecución: https://bugzilla.novell.com/show_bug.cgi?id= 628660 – Marcus

Cuestiones relacionadas