c# expression-trees il .net-reflector

c# - Viendo el código IL generado desde una expresión compilada



expression-trees .net-reflector (2)

¡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 Compile, como estoy seguro de que puedes imaginar.

¿Es posible ver el código IL generado cuando llama a Compile () en un árbol de Expresión? Considera 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 . Compile la aplicación, luego ábrala en Reflector. Puedes ver el código IL de p.Value = 5; Eso hace la tarea. Pero el árbol de expresiones fue hecho y compilado en tiempo de ejecución. ¿Es posible ver el código IL resultante de la compilación?


Cree un DynamicAssembly, luego un DynamicModule, DynamicType y DynamicMethod. Haga que el método sea público y estático y páselo al método CompileTo () en la lambda. Cuando hagas el ensamblaje, márcalo como Guardar. Luego llama al método Save () y pasa una ruta. Se escribirá en el disco. Abrirlo en 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");