2010-05-05 8 views
3

Y a-t-il une bibliothèque directe que je peux utiliser pour accéder au CIL pour un type .NET? Permettez-moi de démontrer ce que je veux le CilExtractor fictif à faire:Accès par programme au CIL pour un type .NET

[Serializable] 
public class Type_For_Extract_Cil_Test { 

    private int _field = 3; 

    public int Method(int value) { 
    checked { 
     return _field + value; 
    } 
    } 

} 

[Test] 
public void Extract_Cil_For_Type_Test() { 
    string actualCil = CilExtractor.ExtractCil(typeof(Type_For_Extract_Cil_Test)); 
    string expectedCil = @" 
    .class public auto ansi serializable beforefieldinit Type_For_Extract_Cil_Test 
     extends [mscorlib]System.Object 
    { 
     .method public hidebysig specialname rtspecialname instance void .ctor() cil managed 
     { 
     .maxstack 8 
     ldarg.0 
     ldc.i4.3 
     stfld int32 Type_For_Extract_Cil_Test::_field 
     ldarg.0 
     call instance void [mscorlib]System.Object::.ctor() 
     ret 
     } 

     .method public hidebysig instance int32 Method(int32 'value') cil managed 
     { 
     .maxstack 8 
     ldarg.0 
     ldfld int32 Type_For_Extract_Cil_Test::_field 
     ldarg.1 
     add.ovf 
     ret 
     } 

     .field private int32 _field 
    }"; 
    // indentations and code formatting issues apart, this should succeed 
    Assert.AreEqual(expectedCil, actualCil); 
} 

Je sais que je peux le faire avec Mono.Cecil ou réflecteur, mais je sais aussi que je dois écrire beaucoup de code pour y parvenir. Étant donné que Reflector le fait déjà sur son interface utilisateur, n'y a-t-il pas un moyen simple d'accéder à cette fonctionnalité, comme avec un simple appel de méthode? Existe-t-il d'autres bibliothèques mieux adaptées à ce scénario spécifique?

Répondre

3

Eh bien, il y a l'outil ildasm.exe fourni par le framework .NET et il peut être utilisé dans un environnement de ligne de commande pour faire le démontage, c'est peut-être un bon point de départ.

Voici les MSDN Documentation sur les options de ligne de commande.

+0

Dans une ère dominée par le réflecteur, j'ai complètement oublié l'ildasm. Merci de me le rappeler! –

1

Je ne connais pas d'outil pour extraire le désassemblage sous forme de texte, autre que l'ildasme.

Je pense que Mono.Cecil est capable de récupérer toutes les métadonnées concernant un assemblage et ses types, y compris le code CIL. L'assemblage est représenté par une collection d'objets, cependant, pas sous forme textuelle.

Probablement le truc Reflection.Emit intégré peut aussi extraire CIL, mais je ne suis pas sûr.

Questions connexes