MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как работает метод GetILAsByteArray()?"
Answer 841834
Влияет ли как-то на 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<mas.Length;i++) { if (mas[i].FieldType == typeof(OpCode)) { OpCode opcode = (OpCode)mas[i].GetValue(null); if (opcode.Value == op) { str = opcode.ToString(); break; } } } textBox1.Text = "0x"+op.ToString("X4")+": "+str;
Результат:
Debug -
0x0000: nop
Release -
0x0003: ldarg.1
Объясняется это тем, что в отладочной сборке в начале каждого метода вставляется пустой оператор для облегчения отладки (чтобы можно было поставить точку останова на самое начало метода, тогда как в релизной сборке можно только на первую строку). Таким образом, режим компиляции действительно влияет на IL-код метода.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.