Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Как работает метод GetILAsByteArray()?

#c_sharp #net #рефлексия


Метод MethodBody.GetILAsByteArray(); возвращает IL-код в байтовом представлении,
сие ясно. Однако я не нашел конкретики в описании работы данного метода на MSDN: возвращает
ли он "дословную" инструкцию, которую описывал я, либо же эта функция возвращает именно
ту инструкцию, которая будет исполняться?

Поясню:


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




Влияет ли как-то на GetILAsByteArray() режим компиляции, или же данный метод всегда
возвращает "дословную" инструкцию метода?
    


Ответы

Ответ 1



Влияет ли как-то на GetILAsByteArray() режим компиляции Ответ - "да". В этом легко убедиться на практике. Напишем тестовый метод: public void Method(int a, int b) { string str = (a+b).ToString(); MessageBox.Show(str); } Далее, напишем такой код для извлечения первого операнда из его MSIL-кода и отображения имени операции: using System; using System.Text; using System.Reflection; using System.Reflection.Emit; ... var mi = this.GetType().GetMethod("Method"); byte[] msil = mi.GetMethodBody().GetILAsByteArray(); ushort op; if(msil[0]==0xfe) op = (ushort)(msil[1] | 0xfe00); else op = (ushort)(msil[0]); //найдем имя операции string str=""; FieldInfo[] mas = typeof(OpCodes).GetFields(); for(int i=0;i

Комментариев нет:

Отправить комментарий