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");