Можно программно отобразить список всех инструкций IL, которые может произвести компилятор .NET?Как я могу программно просмотреть все доступные IL-инструкции .NET CLR?
ответ
Все они доступны на классе System.Reflection.Emit.OpCodes.
Инструкции IL определены в стандартном документе ECMA-335 - Common Language Infrastucture (коды кодировки кода - стр. 295).
документ находится в открытом доступе и может быть загружен по следующей ссылке:
http://www.ecma-international.org/publications/standards/Ecma-335.htm
Однако опкоды которые определяют также в классе System.Reflection.Emit.OpCodes, который является частью типов mscorlib.dll ,
Ниже кода, который может быть использован для извлечения соответствующей информации из этого класса:
// Get the OpcCodes using Reflection
Type opCodes = typeof(OpCodes);
var opCodesList = opCodes.GetFields(BindingFlags.Public | BindingFlags.Static)
.Where(f => f.FieldType == typeof(OpCode))
.Select(f =>
{ OpCode opCode = (OpCode)f.GetValue(null);
return new {Name=f.Name, Instruction = opCode.Name, Size = opCode.Size, OpCode = string.Format("0x{0:X2}", opCode.Value) };
});
// Print to the Console
var opCodesStrings = opCodesList
.Select(o => string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", o.Name, o.Instruction, o.Size, o.OpCode))
.ToList();
opCodesStrings.Insert(0, string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", "Name", "Instruction", "Size", "OpCode"));
opCodesStrings.Insert(1, string.Format("{0,-10}{1,-15}{2,-10}{3,-10}", "----", "-----------", "----", "------"));
opCodesStrings.ForEach(Console.WriteLine);
Первые строки выпускаемой продукции являются:
Name Instruction Size OpCode ---- ----------- ---- ------ Nop nop 1 0x00 Break break 1 0x01 Ldarg_0 ldarg.0 1 0x02 Ldarg_1 ldarg.1 1 0x03 Ldarg_2 ldarg.2 1 0x04 Ldarg_3 ldarg.3 1 0x05 Ldloc_0 ldloc.0 1 0x06 Ldloc_1 ldloc.1 1 0x07 Ldloc_2 ldloc.2 1 0x08 Ldloc_3 ldloc.3 1 0x09 Stloc_0 stloc.0 1 0x0A Stloc_1 stloc.1 1 0x0B Stloc_2 stloc.2 1 0x0C Stloc_3 stloc.3 1 0x0D Ldarg_S ldarg.s 1 0x0E Ldarga_S ldarga.s 1 0x0F ...
Следующие ссылка указывает на страницу MSDN, описывающие каждый OpCode: https://msdn.microsoft.com/it-it/library/System.Reflection.Emit.OpCodes(v=vs.110).aspx
Если вы хотите получить их из класса OpCodes, вам нужно будет отфильтровать коды «Префикс [1-7]», поскольку они не относятся к реальным op-кодам. Кроме того, OpCodes не включает «нет». prefix op, поэтому вам нужно будет включить его вручную. –
Вы можете попробовать [Википедия] (http://en.m.wikipedia.org/wiki/List_of_CIL_instructions). –