Domanda

E 'possibile visualizzare il codice IL generato quando si chiama Compile () su un albero di espressione? Si consideri questo esempio molto semplice:

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;
    }
}

Ora, l'albero di espressione fa quello che l'ultima linea di Main dice. Compilare l'applicazione, quindi aprirlo in Reflector. Si può vedere il codice IL di p.Value = 5; che fa l'assegnazione. Ma l'albero di espressione è stata fatta e compilato in fase di esecuzione. E 'possibile visualizzare il codice IL risultante dalla compilazione?

È stato utile?

Soluzione

Sì! Utilizzare questo strumento:

https://github.com/drewnoakes/il-visualizer

Questo è stato incredibilmente utile quando stavo attuazione e il debug di compilazione, come sono sicuro che si possa immaginare.

Altri suggerimenti

Crea un DynamicAssembly, poi un DynamicModule, DynamicType e DynamicMethod. Fare quel metodo pubblico e statico e passarlo al metodo CompileTo () sul lambda. Quando si effettua la bandiera di montaggio come Salva. Quindi chiamare il metodo Save () e passare un percorso. Sarà scritto su disco. Aprilo riflettore.

Qualcosa di simile:

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");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top