Como novedad, trato de ver qué tan diferente se ve la IL del código de peso ligero en el tiempo de ejecución frente al código generado por el compilador VS, ya que noté que el código VS tiende a ejecutarse con un perfil de rendimiento diferente para cosas como moldes.¿Cómo obtengo un bytearray de IL de DynamicMethod?
Así que escribió el siguiente código ::
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);
Desafortunadamente, esto arroja una excepción, ya GetMethodBody es aparentemente una operación ilegal en el código generado por los árboles de expresión. ¿Cómo puedo hacerlo de una manera bibliotecaria (es decir, no con una herramienta externa a menos que la herramienta tenga una API) mire el código generado por código usando codegen ligero?
Editar: el error ocurre en la línea 5, compiled.Method.GetMethodBody() arroja la excepción.
Edit2: ¿Alguien sabe cómo recuperar las variables locales declaradas en el método? ¿O no hay forma de GetVariables?
¿Qué línea arroja la excepción? ¿Puedes comentar el primer Array.ForEach y ver si funciona?Sospecho que la primera llamada a GetMethodBody() está fallando simplemente porque esa expresión no se ha compilado en IL. No veo ninguna razón por la cual la segunda llamada debería fallar. – cdhowie
Pregunta interesante. Obtengo una InvalidOperationException ("Operación no válida debido al estado actual del objeto") en la llamada a GetMethodBody. No estoy seguro de cómo comenzar la vida como un CachedAnonymousDelegate vs Expression afectaría su comportamiento como Func. Voy a seguir trabajando en este. – Sorax
La respuesta seleccionada debe cambiarse porque no cubre todos los casos y es innecesariamente compleja. Por favor vea [esta respuesta] (http://stackoverflow.com/a/35711507/521757). – jnm2