Visualizzazione del codice IL generato da un'espressione compilata
-
16-10-2019 - |
Domanda
E 'possibile visualizzare il codice IL generato quando si chiama Compile () su un albero di espressione? Si consideri questo esempio molto semplice:
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;
}
}
Ora, l'albero di espressione fa quello che l'ultima linea di Main
dice. Compilare l'applicazione, quindi aprirlo in Reflector. Si può vedere il codice IL di p.Value = 5;
che fa l'assegnazione. Ma l'albero di espressione è stata fatta e compilato in fase di esecuzione. E 'possibile visualizzare il codice IL risultante dalla compilazione?
Soluzione
Sì! Utilizzare questo strumento:
https://github.com/drewnoakes/il-visualizer
Questo è stato incredibilmente utile quando stavo attuazione e il debug di compilazione, come sono sicuro che si possa immaginare.
Altri suggerimenti
Crea un DynamicAssembly, poi un DynamicModule, DynamicType e DynamicMethod. Fare quel metodo pubblico e statico e passarlo al metodo CompileTo () sul lambda. Quando si effettua la bandiera di montaggio come Salva. Quindi chiamare il metodo Save () e passare un percorso. Sarà scritto su disco. Aprilo riflettore.
Qualcosa di simile:
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");