Come un po 'di novità, sto provando a vedere quanto sia diverso il IL dal codice leggero generato in fase di esecuzione rispetto al codice generato dal compilatore VS, come ho notato che il codice VS tende a funzionare con un profilo di prestazioni diverso per cose come calchi.Come posso ottenere un IL bytearray da un DynamicMethod?
Così ho scritto il seguente codice ::
Func<object,string> vs = x=>(string)x;
Expression<Func<object,string>> exp = x=>(string)x;
var compiled = exp.Compile();
Array.ForEach(vs.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Array.ForEach(compiled.Method.GetMethodBody().GetILAsByteArray(),Console.WriteLine);
Purtroppo, questo genera un'eccezione come GetMethodBody è apparentemente un'operazione non valida sul codice generato da alberi di espressione. Come posso fare in una libreria (cioè non con uno strumento esterno a meno che lo strumento non abbia un'API) guardare il codice generato dal codice usando il codegen leggero?
Modifica: l'errore si verifica sulla riga 5, compilato.Method.GetMethodBody() genera l'eccezione.
Edit2: Qualcuno sa come recuperare le variabili locali dichiarate nel metodo? O non c'è modo di ottenere le variabili?
Quale riga sta generando l'eccezione? Puoi commentare il primo Array.ForEach e vedere se funziona?Sospetto che la prima chiamata a GetMethodBody() fallisca semplicemente perché quell'espressione non è stata compilata in IL. Non vedo alcun motivo per cui la seconda chiamata dovrebbe fallire. – cdhowie
Domanda interessante. Ricevo una InvalidOperationException ("Operazione non valida a causa dello stato corrente dell'oggetto") nella chiamata GetMethodBody. Non sono sicuro di come l'avvio della vita come CachedAnonymousDelegate vs Expression influenzi il tuo comportamento come Func. Continuerò a lavorare su questo. – Sorax
La risposta selezionata deve essere cambiata perché non copre tutti i casi ed è inutilmente complessa. Si prega di consultare [questa risposta] (http://stackoverflow.com/a/35711507/521757). – jnm2