2010-09-01 30 views
1

J'ai une liste d'environ 25 types trouvés dans l'assembly mscorlib.dll Microsoft .NET où j'ai besoin d'extraire les signatures IL de la classe et de ses membres . Je veux un fichier par type, avec chaque signature sur une ligne. Ainsi, par exemple, prendre le typeMécanisme pour extraire des signatures spécifiques IL (langage intermédiaire .NET) d'un assembly

System.Collections.Generic.Comparer<T> 

Je veux extraire les éléments suivants de l'ensemble de ce type (il y a des députés que je ne vais pas avoir besoin, mais je peux gérer cela manuellement si nécessaire).

.class public abstract auto ansi serializable beforefieldinit System.Collections.Generic.Comparer`1<T> extends System.Object implements System.Collections.IComparer, class System.Collections.Generic.IComparer`1<!T> 
.method family hidebysig specialname rtspecialname instance void .ctor() cil managed 
.method public hidebysig newslot abstract virtual instance int32 Compare(!T x, !T y) cil managed 
.method private hidebysig newslot virtual final instance int32 System.Collections.IComparer.Compare(object x, object y) cil managed 
.property class System.Collections.Generic.Comparer`1<!T> Default() { .get class System.Collections.Generic.Comparer`1<!T> System.Collections.Generic.Comparer`1::get_Default() } 

Alors, je l'ai pensé à quatre façons d'y parvenir:

  • couper et coller manuellement chaque signature de chaque type à la main dans les fichiers texte à partir ildasm (soit directement, soit par l'intermédiaire d'une décharge de mscorlib.dll). Certains types sont assez longs, donc cela pourrait devenir fastidieux. Et ce n'est certainement pas une bonne solution à long terme si je dois en faire plus.

  • Écrivez un outil qui utilise Reflection pour essayer d'obtenir toutes les signatures. J'ai, à un niveau élevé, pensé à utiliser quelque chose comme le code-code [1] ci-dessous.

  • Ecrire un outil qui utilise l'analyse syntaxique chaîne sur la décharge de l'IL de ildasm pour trouver les types et obtenir les signatures

  • Utilisez un outil déjà existant pour accomplir la tâche.

Est-ce que quelqu'un connaît un outil ou un mécanisme existant qui pourrait m'aider à accomplir ma tâche? Si non, des suggestions sur la direction à prendre pour obtenir un tel outil? Et si vous avez des idées de code sur la façon de le faire, j'aimerais les entendre.

[1]

System.Reflection.GetType(string) 
Type.GetMethods() For each item in 
MethodInfo, GetMethodBody() 
GetILAsByteArray().ToString() 
Determine a way to get just the signature from the IL 

Répondre

1

réflecteur porte rouge pourrait faire couper et coller aller beaucoup plus vite.

+0

Merci Ben. Red Gate Reflector a réduit mon temps de 60-70% Je parie. C'est une excellente solution à court terme. –

1

Si vous décidez d'obtenir la signature de l'IL, vous devrez écrire un type d'analyseur de signature. David Broman a un échantillon affiché sur la galerie de code MSDN here. Ce n'est pas entièrement fonctionnel (en particulier, vous devrez ajouter du support pour les génériques), mais cela vous donne une longueur d'avance.

2

Vous pouvez reconstruire la signature de méthode à partir des informations trouvées dans MethodInfo. Vous n'avez pas besoin de GetMethodBody - il n'y a pas d'information sur les signatures. MemberInfo.Name, MemberInfo.ReturnType, MemberInfo.GetParameters(), etc. Tout est là.