Resolvendo os tokens encontrados na IL a partir de um método dinâmico
Graças a Hans Passant, respondendo minha pergunta aqui:Como obtenho um bytearray de IL de um DynamicMethod?
Eu consegui me levantar e correr. Agora estou tentando resolver os tokens de metadados encontrados na IL emitida, para ver quais métodos estão sendo chamados ou quais não. Eu sou capaz de resolver que o próximo token no corpo do método é uma chamada. Estou usando algum código deMono.Reflection
MethodBodyReader de.
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);
Lança uma exceção dizendo que o token não pode ser resolvido nesse domínio. Alguém tem um truque aqui? Devo tentar passar os parâmetros genéricos dos delegados ou eles são totalmente inúteis?
Atualmente, estou brincando com a idéia de escrever um descompilador para delegados em árvores de expressão e eu realmente gostaria de poder usar árvores de expressão que eu me compile como casos de teste, pois sempre posso voltar ao original e comparar.