Anzeigen des von einem kompilierten Ausdruck generierten IL-Codes

.net-reflector c# expression-trees il

Frage

Ist es möglich, den IL-Code anzuzeigen, der beim Aufruf von Compile () in 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;
    }
}

Nun macht der Ausdrucksbaum das, was die letzte Zeile von Main sagt. Kompilieren Sie die Anwendung und öffnen Sie sie in Reflector. Sie können den IL-Code von p.Value = 5; Das macht die Aufgabe. Aber der Ausdrucksbaum wurde zur Laufzeit erstellt und kompiliert. Ist es möglich, den resultierenden IL-Code aus der Kompilierung zu betrachten?

Akzeptierte Antwort

Ja! Benutze dieses Werkzeug:

http://blogs.msdn.com/b/haibo_luo/archive/2006/11/16/take-two-il-visualizer.aspx

Das war unglaublich nützlich, als ich Compile implementierte und kompilierte, wie Sie sich sicher vorstellen können.


Beliebte Antwort

Erstellen Sie eine DynamicAssembly, dann ein DynamicModule, DynamicType und DynamicMethod. Machen Sie diese Methode public und statisch und übergeben Sie sie an die Methode CompileTo () für das Lambda. Wenn Sie die Assembly als Save markieren, wird dies als Flag gekennzeichnet. Rufen Sie dann die Save () Methode auf und übergeben Sie einen Pfad. Es wird auf die Festplatte geschrieben. Pop es offen im Reflektor.

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 with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow