Разрешение токенов, найденных в IL, динамическим методом
Спасибо Хансу Пассанту, который ответил на мой вопрос здесь:Как получить байтовый массив IL из DynamicMethod?
Я смог встать и бежать. Сейчас я пытаюсь разрешить токены метаданных, обнаруженные в излучаемом IL, чтобы узнать, какие методы вызываются, а какие нет. Я могу решить, что следующий токен в теле метода - это вызов. Я использую код изMono.Reflection
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);
Выдает исключение, говорящее о том, что токен не разрешен в этом домене. У кого-нибудь есть хитрость здесь? Стоит ли передавать делегатам общие параметры или они абсолютно бесполезны?
В настоящее время я занимаюсь идеей написания декомпилятора для делегатов в деревьях выражений, и мне бы очень хотелось иметь возможность использовать деревья выражений, которые я собираю в качестве тестовых случаев, поскольку я всегда могу вернуться к оригиналу и сравнить.