Прочитайте LocalSignature DynamicMethod: токены нестандартного типа?

Недавно я начал использовать ILVisualizer в VS2010 для проверки IL на наличие динамических методов. Однако он не извлекает информацию LocalVariable из потока IL, поэтому я попробую (конечно, ради удовольствия и потому, что это хороший опыт обучения :)

Для статически скомпилированных методов это не проблема, так как мы можем получить доступ к телу метода через GetMethodBody() и получить оттуда локальные переменные.

Однако с DynamicMethods тело метода недоступно через GetMethodBody(). Я нашел обходной путь, который дает мне локальную подпись в виде массива байтов, и оттуда я могу извлечь количество, тип и индекс локальных переменных метода в соответствии со спецификацией CIL. Все хорошо, пока мы имеем дело с нативными типами (short, byte, string...).

Но если локальная переменная является типом класса, на нее ссылаются с флагом ELEMENT_TYPE_INTERNAL (0x21) вместо ELEMENT_TYPE_CLASS в локальной подписи.

К сожалению, я ничего не могу найти о том, как читать тип, хранящийся как ELEMENT_TYPE_INTERNAL. Что случилось с этим? Использует ли MS нестандартный CIL для динамических методов? Кто-нибудь знает, как правильно читать эти подписи?

Изменить Я наткнулся на несколько исходных файлов для mscorlib.dll и обнаружил в исходном коде SignatureHelper, что это может происходить, когда класс является типом среды выполнения. Я расследую это...


person T. Fabre    schedule 16.05.2012    source источник


Ответы (1)


Ну, я верю, что понял!

Получается, что данные после флага ELEMENT_TYPE_INTERNAL не являются сжатыми данными, это обычное 32-битное целое число (или 64, в зависимости от платформы, хотя я должен это подтвердить), хранящееся в 4 байтах, которые являются указателем на указанный тип.

Несмотря на то, что я не смог найти способ получить RuntimeTypeHandle из IntPtr, циклический просмотр токенов в объекте DynamicScope метода и сравнение значений работают для получения дескриптора типа.

person T. Fabre    schedule 16.05.2012