Visualización del código IL generado a partir de una expresión compilado
-
16-10-2019 - |
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?
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");