2013-02-16 12 views
5

Chcę zobaczyć zestaw x86 generowane przez kompilator .Net w just-in-time. Wiem, że how to do this for "normal" code, skompilowane z wyprzedzeniem, ale nie wiem, jak to zrobić dla kodu generowanego dynamicznie w czasie wykonywania (co robię z drzewem wyrażeń).Jak wyświetlić dezasemkację delegata utworzonego przez kompilację drzewa wyrażeń?

Nie jestem nawet pewien, co wypróbować. Na przykład delegat utworzony przez kompilację drzewa wyrażeń wskazuje na adres, ale nie wiem, co użyć, aby zobaczyć, co jest pod tym adresem.

Odpowiedz

2

Skończyłem z wykorzystaniem podstawowej sugestii leppiego, wyprowadzając wyrażenie do zewnętrznego zespołu. Następnie użyłem reflektora, aby wyodrębnić metodę i wkleić ją do mojego własnego kodu. Potem uruchomiłem metodę wklejania i sprawdziłem, co zostało podważone. To może nie być w 100% dokładne, ale przynajmniej daje wskazanie.

Oto niektóre kodu do zapisywania się metodę (powstały zespół kończy się w tym samym katalogu co plik wykonywalny):

/// <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"); 
} 

Kiedy masz zespół, można użyć narzędzia jak reflektor, aby wyodrębnić metody .

+0

Dzięki za udostępnienie :) – leppie

2

Użyj LambdaExpression.CompileToMethod(MethodBuilder).

Następnie można zapisać AssemblyBuilder do pliku, który można zbadać w ulubionym Disassembler NET.

+0

Czy drgania będą traktować CIL wygenerowane w czasie wykonywania w dokładnie taki sam sposób jak CIL załadowany ze złożenia? Co się stanie, jeśli na przykład heurystyki przeprowadzą więcej optymalizacji w jednym z przypadków? –

+0

Czy chcesz wyświetlić zestaw JIT lub IL? Moja odpowiedź nie dotyczy tego pierwszego. IL załadowane z dowolnego miejsca powinny być traktowane tak samo. – leppie

+0

Chcę wyświetlić kod zespołu x86. –

Powiązane problemy