Недавно я начал использовать 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, что это может происходить, когда класс является типом среды выполнения. Я расследую это...