Visualización del código IL generado a partir de una expresión compilada


¿Es posible ver el código IL generado cuando se llama a Compile() en un árbol de expresiones? Considere este ejemplo muy simple:

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

Ahora, el árbol de expresiones hace lo que dice la última línea de Main. Compila la aplicación, luego ábrela en Reflector. Puedes ver el código IL de p.Value = 5; que hace la asignación. Pero el árbol de expresiones fue creado y compilado en tiempo de ejecución. ¿Es posible ver el código IL resultante de la compilación?

Author: Amy, 2011-01-22

2 answers

¡Sí! Utilice esta herramienta:

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

Esto fue increíblemente útil cuando estaba implementando y depurando Compilar, como estoy seguro de que se puede imaginar.

 29
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-21 22:48:21

Crea un DynamicAssembly, luego un DynamicModule, dynamicType y DynamicMethod. Hacer que ese método sea público y estático y pasarlo al método CompileTo() en la lambda. Cuando hagas el ensamblaje, márcalo como Guardado. Luego llama al método Save () y pasa una ruta. Se escribirá en el disco. Abre el reflector.

Algo como:

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");
 23
Author: justin.m.chase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-14 08:00:08