Anzeigen des IL -Codes, der aus einem kompilierten Ausdruck generiert wurde
-
16-10-2019 - |
Frage
Ist es möglich, den IL -Code anzuzeigen, der beim Aufrufen von Compile () auf einem Ausdrucksbaum generiert wird? Betrachten Sie dieses sehr einfache Beispiel:
class Program
{
public int Value { get; set; }
static void Main(string[] args)
{
var param = Expression.Parameter(typeof(Program));
var con = Expression.Constant(5);
var prop = Expression.Property(param, typeof(Program).GetProperty("Value"));
var assign = Expression.Assign(prop, con);
Action<Program> lambda = Expression.Lambda<Action<Program>>(assign, param).Compile();
Program p = new Program();
lambda(p);
//p.Value = 5;
}
}
Jetzt macht der Ausdrucksbaum das, was die letzte Zeile von Main
sagt. Kompilieren Sie die Anwendung und öffnen Sie sie dann in Reflektor. Sie können den IL -Code von sehen p.Value = 5;
Das macht die Aufgabe. Aber der Ausdrucksbaum wurde zur Laufzeit gemacht und zusammengestellt. Ist es möglich, den resultierenden IL -Code aus dem Kompilieren anzuzeigen?
Lösung
Ja! Verwenden Sie dieses Tool:
https://github.com/drewnoakes/il-visualizer
Dies war unglaublich nützlich, als ich das Kompilieren implementierte und debuggte, wie ich mir sicher vorstellen kann.
Andere Tipps
Erstellen Sie eine Dynamicassembly, dann eine DynamicModule, Dynamictype und DynamicMethod. Machen Sie diese Methode öffentlich und statisch und geben Sie sie an die Methode compileto () auf der Lambda weiter. Wenn Sie die Montage durchführen lassen, speichern Sie sie. Rufen Sie dann die Methode Save () auf und übergeben Sie einen Pfad. Es wird auf die Festplatte geschrieben. Pop es im Reflektor auf.
Etwas wie:
var da = AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName("dyn"), // call it whatever you want
AssemblyBuilderAccess.Save);
var dm = da.DefineDynamicModule("dyn_mod", "dyn.dll");
var dt = dm.DefineType("dyn_type");
var method = dt.DefineMethod(
"Foo",
MethodAttributes.Public | MethodAttributes.Static);
lambda.CompileToMethod(method);
dt.CreateType();
da.Save("dyn.dll");