51 votes

c # Puis-je utiliser la réflexion pour inspecter le code d'une méthode?

je joue avec l'api de réflexion c #. je peux facilement charger des informations de type de classes, méthodes, etc. dans un assemblage.

maintenant je me demande comment puis-je charger et lire le code dans une méthode?

40voto

Foxfire Points 4503

De Base De La Réponse:

Vous ne pouvez pas avec l'API reflection (Système d'.La réflexion).

La raison en est que le reflet de l'api est conçue pour fonctionner sur les Métadonnées (Type de cours, le Nom et la Signature de Méthodes, ...) mais pas sur le niveau de données (ce qui serait l'IL-flux lui-même).

Étendue Réponse:

Vous pouvez émettre (mais pas lu) IL avec le Système.De la réflexion.Émettre (par ex. aide de la classe ilgenerator Classe).

Par le biais MethodInfo.GetMethodBody() vous pouvez obtenir le binaire IL-flux pour la mise en œuvre d'une méthode. Mais c'est généralement complètement inutile par lui-même.

Il y a des bibliothèques externes (comme Cecil) que vous pouvez utiliser pour lire/modifier/ajouter/supprimer du code à l'intérieur d'une méthode.

22voto

Chris Taylor Points 25865

Cela dépend de ce que tu veux dire par la lecture du code. Il existe 4 formes de la code.

1 - Le code source par exemple. l'original de C# ou de VB.NET - Non, vous ne peut pas obtenir avec réflexion
2 - La symbolique de code IL - Non, vous ne peut pas obtenir avec réflexion
3 - La JITed code assembleur - Non, vous ne peut pas obtenir avec réflexion

4 - IL d'octets, les octets qu'IL est compilé, ce que vous pouvez obtenir.

Jetez un oeil à MethodBase.GetMethodBody() par exemple, vous pouvez obtenir le IL octets, les variables locales, à l'exception des cadres etc. http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getmethodbody.aspx

9voto

Aaronaught Points 73049

Vous sorte de peut. La fonction correspondante est MethodBase.GetMethodBody.

Ce n'est pas exactement le plus utile de l'API. Vous pouvez obtenir quelques informations de base sur ce qui est à l'intérieur de la méthode, et vous pouvez obtenir le IL, comme un tableau d'octets. C'est à ce sujet.

Il y a un peu plus de l'API dans le Mono.Cecil bibliothèque, qui expose MethodDefinition de la classe avec sa propre MethodBody mise en œuvre qui contient de vrais Instructions, de sorte que vous n'avez pas à interpréter le raw du byte-code. Encore, si vous êtes à la recherche pour obtenir le code C# en dehors de ça à la Réflecteur, vous allez être déçu. Aussi, Cecil n'est pas très bien documenté.

Si vous avez envie d'essayer, alors bonne chance.

6voto

Ark-kun Points 3098

Il y a maintenant des bibliothèques/colis qui vous permettra d'inspecter le code de la méthode et même de le décompiler d' Expression:

1voto

DevelopingChris Points 12510

Non
Il s'agit d'une fonctionnalité prévue pour la prochaine version de C #. Vous pouvez utiliser le CodeDom pour obtenir plus d'informations que de réflexion, mais vous ne pouvez pas encore interroger l'arbre d'analyse.

Eh bien, il y a toujours mono, en mono le compilateur est un service, et vous pouvez obtenir les arbres d'analyse à l'exécution.

La meilleure question est pourquoi vous voulez?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X