Разрешение токенов, найденных в IL, с помощью динамического метода

Спасибо Гансу Пассанту, ответившему на мой вопрос здесь: Как мне получить байтовый массив IL из DynamicMethod?

Я смог начать работу. Теперь я пытаюсь разрешить токены метаданных, обнаруженные в испускаемом IL, чтобы увидеть, какие методы вызываются, а какие нет. Я могу решить, что следующий токен в теле метода - это вызов. Я использую код из MethodBodyReader Mono.Reflection .

static byte[] GetILByteArray(Delegate @delegate){
   // does stuff mentioned in other thread
}
...
Expression 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);

Выдает исключение, говорящее, что токен не разрешается в этом домене. У кого-нибудь есть трюк? Стоит ли мне пытаться передать общие параметры делегатов, или они совершенно бесполезны?

В настоящее время я пытаюсь написать декомпилятор для делегатов в деревья выражений, и мне бы очень хотелось иметь возможность использовать деревья выражений, которые Я составляю тестовые примеры, так как всегда могу вернуться к оригиналу и сравнить.

5
задан Community 23 May 2017 в 10:27
поделиться