2013-02-16 10 views
5

Ich möchte sehen, dass die x86-Assembly durch den Just-in-Time-Compiler von .Net generiert wird. Ich weiß how to do this for "normal" code, im Voraus kompiliert, aber ich weiß nicht, wie man es für Code macht, der zur Laufzeit dynamisch erzeugt wird (was ich mit Ausdrucksbäumen mache).Wie kann ich die Disassemblierung eines durch das Kompilieren eines Ausdrucksbaums erstellten Delegaten anzeigen?

Ich bin nicht einmal wirklich sicher, was ich versuchen soll. Zum Beispiel zeigt der durch das Kompilieren der Ausdrucksbaumstruktur erzeugte Delegat auf eine Adresse, aber ich weiß nicht, was ich verwenden soll, um zu sehen, was sich an dieser Adresse befindet.

Antwort

2

Ich benutzte leppies grundlegenden Vorschlag und gab den Ausdruck an eine externe Baugruppe aus. Dann habe ich Reflector verwendet, um die Methode zu extrahieren und sie in meinen eigenen Code einzufügen. Dann führte ich die eingefügte Methode aus und überprüfte, was ich falsch gemacht hatte. Dies ist zwar nicht 100% ig korrekt, gibt aber zumindest einen Hinweis.

Hier ist ein Code für das Verfahren auszuschreiben (die resultierende Anordnung endet in demselben Verzeichnis wie die ausführbare Datei nach oben):

/// <summary> 
/// Writes an assembly, containing the given method, to the working directory. 
/// The assembly, type, and method are named based on the given hash name. 
/// </summary> 
public static void WriteMethodToAssembly<T>(Expression<T> method, string hashName) { 
    var assemblyName = new AssemblyName(hashName); 
    var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave); 
    var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll"); 
    var typeBuilder = moduleBuilder.DefineType(hashName, TypeAttributes.Public); 
    var methodBuilder = typeBuilder.DefineMethod("Run" + hashName, MethodAttributes.Public | MethodAttributes.Static); 
    method.CompileToMethod(methodBuilder); 

    typeBuilder.CreateType(); 
    assemblyBuilder.Save(hashName + ".dll"); 
} 

Sobald Sie die Montage haben, können Sie ein Tool wie Reflektor verwenden können, um die Methode zu extrahieren .

+0

Danke für das Teilen :) – leppie

2

Verwenden Sie LambdaExpression.CompileToMethod(MethodBuilder).

Sie können den AssemblyBuilder dann in einer Datei speichern, die Sie in Ihrem bevorzugten, NET Disassembler untersuchen können.

+0

Behandelt der Jitter CIL, der zur Laufzeit erzeugt wird, genau so wie CIL, das von einer Baugruppe geladen wird? Was ist, wenn es beispielsweise Heuristiken gibt, die in einem der Fälle mehr Optimierungen vornehmen? –

+0

Möchten Sie die JIT-Baugruppe oder die IL anzeigen? Meine Antwort gilt nicht für die erste. Von überall geladene ILs sollten gleich behandelt werden. – leppie

+0

Ich möchte den x86-Assemblercode anzeigen. –

Verwandte Themen