Pregunta

¿Es posible ver el código IL generada cuando se llama Compilar () en un árbol de expresión? 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 expresión hace lo que la última línea de Main dice. Compilar la aplicación, a continuación, abrirlo en el reflector. Puede ver el código de IL p.Value = 5; que hace la asignación. Pero el árbol de expresión se hizo y se compila en tiempo de ejecución. ¿Es posible ver el código IL resultante de la compilación?

¿Fue útil?

Solución

Sí! Utilice esta herramienta:

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

Esto fue increíblemente útil cuando estaba poniendo en práctica y depuración de compilación, como estoy seguro de que se pueda imaginar.

Otros consejos

Crear un DynamicAssembly, a continuación, un DynamicModule, DynamicType y DynamicMethod. Hacer que el método público y estático y pasarlo a la CompileTo método () de la lambda. Al tomar la bandera de montaje como en Guardar. A continuación, llame al método Save () y pasar un camino. Se escribe en el disco. Pop se abren en el reflector.

Algo así 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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top