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?

War es hilfreich?

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top