2010-08-05 3 views
8

Quel est le moyen le plus simple de parcourir un methodinfo dans C#?Traverse une méthode C# et anazlye le corps de la méthode

Je veux traverser le corps de la méthode et trouver des références de champs et autres et récupérer les types.

En System.Reflection il y a:

mi.GetMethodBody().GetILAsByteArray() 

qui est un peu faible niveau et nécessiterait « une certaine » travail avant que je serais capable de traverser le corps.

Je sais que Cecil existe, mais il y a un problème lors du chargement d'un assemblage en mémoire avec cecil. L'assemblage avec lequel je travaille n'est pas toujours "sur disque", il peut être un assemblage en mémoire compilé par exemple. Boo, et je wan't une solution propre sans écrit l'ensemble temporaire sur le disque.

Quelles autres alternatives existe-t-il pour cela?

+0

Quel est le problème avec Cecil et les assemblys en mémoire? –

+0

@Tim: J'ai trouvé ça http://markmail.org/message/yssmfgrsqnnnzrvt, c'est un peu vieux. Il n'y a aucune méthode dans AssemblyFactory pour charger un assembly existant uniquement à partir de fichier, byte [] ou Stream. J'ai essayé de sérialiser un assembly généré par Boo à byte [] mais j'ai obtenu "Type System.Reflection.Emit.AssemblyBuilder n'est pas marqué comme sérialisable". Peut-être que je fais quelque chose de mal avec la récupération d'un octet [] à partir d'un assemblage. – Marcus

Répondre

7

Cette chose devrait vous aider: Reflection based CIL reader. Il fonctionne sur un tableau d'octets obtenu en appelant GetILAsByteArray()

+0

Merci, ça devrait le faire. Doit avoir manqué celui-là quand googled pour une solution. – Marcus

+1

Au moins vous avez googlé avant de demander. Pas comme beaucoup ici sur le site ;-) –

+0

Si quelqu'un de la mono-équipe lit ceci, il y a un bug ou quelque chose dans le runtime: https://bugzilla.novell.com/show_bug.cgi?id= 628660 – Marcus

Questions connexes