Resolver los tokens encontrados en la IL desde un método dinámico
Gracias a Hans Passant respondiendo mi pregunta aquí:¿Cómo obtengo un bytearray IL de un método dinámico?
Pude ponerme en marcha. Ahora estoy tratando de resolver los tokens de metadatos que se encuentran en la IL emitida, para ver qué métodos se llaman o no. Puedo resolver que el siguiente token en el cuerpo del método es una llamada. Estoy usando un código deMono.Reflection
's MethodBodyReader.
static byte[] GetILByteArray(Delegate @delegate){
// does stuff mentioned in other thread
}
...
Expression<Action> foo = () => Console.WriteLine(0);
var compiled = foo.Compile();
var bytes = GetILByteArray(compiled);
int index =Array.FindIndex(bytes,b=>GetOpCode(b).OperandType == OperandType.InlineMethod);
var token = BitConverter.ToInt32(bytes,index+1);
compiled.Method.Module.ResolveMember(token);
Lanza una excepción que dice que el token no se puede resolver en ese dominio. ¿Alguien tiene un truco aquí? ¿Debería intentar pasar los parámetros genéricos de los delegados o son totalmente inútiles?
Actualmente estoy jugando con la idea de escribir un descompilador para delegados en árboles de expresión y realmente me gustaría poder usar árboles de expresión que compile yo mismo como casos de prueba, ya que siempre puedo volver al original y comparar.