Поделиться через


OpCodes Класс

Определение

Содержит поля, предоставляющие инструкции языка MSIL для выпуска элементами класса ILGenerator (например, Emit(OpCode)).

public ref class OpCodes
public class OpCodes
[System.Runtime.InteropServices.ComVisible(true)]
public class OpCodes
type OpCodes = class
[<System.Runtime.InteropServices.ComVisible(true)>]
type OpCodes = class
Public Class OpCodes
Наследование
OpCodes
Атрибуты

Примеры

В следующем примере демонстрируется построение динамического метода с помощью ILGenerator метода для преобразования OpCodes в MethodBuilder.

using namespace System;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;
Type^ CreateDynamicType()
{
   array<Type^>^ctorParams = {int::typeid,int::typeid};
   AppDomain^ myDomain = Thread::GetDomain();
   AssemblyName^ myAsmName = gcnew AssemblyName;
   myAsmName->Name = "MyDynamicAssembly";
   AssemblyBuilder^ myAsmBuilder = myDomain->DefineDynamicAssembly( myAsmName, AssemblyBuilderAccess::Run );
   ModuleBuilder^ pointModule = myAsmBuilder->DefineDynamicModule( "PointModule", "Point.dll" );
   TypeBuilder^ pointTypeBld = pointModule->DefineType( "Point", TypeAttributes::Public );
   FieldBuilder^ xField = pointTypeBld->DefineField( "x", int::typeid, FieldAttributes::Public );
   FieldBuilder^ yField = pointTypeBld->DefineField( "y", int::typeid, FieldAttributes::Public );
   Type^ objType = Type::GetType( "System.Object" );
   ConstructorInfo^ objCtor = objType->GetConstructor( gcnew array<Type^>(0) );
   ConstructorBuilder^ pointCtor = pointTypeBld->DefineConstructor( MethodAttributes::Public, CallingConventions::Standard, ctorParams );
   ILGenerator^ ctorIL = pointCtor->GetILGenerator();
   
   // First, you build the constructor.
   ctorIL->Emit( OpCodes::Ldarg_0 );
   ctorIL->Emit( OpCodes::Call, objCtor );
   ctorIL->Emit( OpCodes::Ldarg_0 );
   ctorIL->Emit( OpCodes::Ldarg_1 );
   ctorIL->Emit( OpCodes::Stfld, xField );
   ctorIL->Emit( OpCodes::Ldarg_0 );
   ctorIL->Emit( OpCodes::Ldarg_2 );
   ctorIL->Emit( OpCodes::Stfld, yField );
   ctorIL->Emit( OpCodes::Ret );
   
   //  Now, you'll build a method to output some information on the
   // inside your dynamic class. This method will have the following
   // definition in C#:
   //  public void WritePoint()
   MethodBuilder^ writeStrMthd = pointTypeBld->DefineMethod( "WritePoint", MethodAttributes::Public, void::typeid, nullptr );
   ILGenerator^ writeStrIL = writeStrMthd->GetILGenerator();
   
   // The below ILGenerator created demonstrates a few ways to create
   // String* output through STDIN.
   // ILGenerator::EmitWriteLine(String*) will generate a ldstr and a
   // call to WriteLine for you.
   writeStrIL->EmitWriteLine( "The value of this current instance is:" );
   
   // Here, you will do the hard work yourself. First, you need to create
   // the String* we will be passing and obtain the correct WriteLine overload
   // for said String*. In the below case, you are substituting in two values,
   // so the chosen overload is Console::WriteLine(String*, Object*, Object*).
   String^ inStr = "( {0}, {1})";
   array<Type^>^wlParams = {String::typeid,Object::typeid,Object::typeid};
   
   // We need the MethodInfo to pass into EmitCall later.
   MethodInfo^ writeLineMI = Console::typeid->GetMethod( "WriteLine", wlParams );
   
   // Push the String* with the substitutions onto the stack.
   // This is the first argument for WriteLine - the String* one.
   writeStrIL->Emit( OpCodes::Ldstr, inStr );
   
   // Since the second argument is an Object*, and it corresponds to
   // to the substitution for the value of our integer field, you
   // need to box that field to an Object*. First, push a reference
   // to the current instance, and then push the value stored in
   // field 'x'. We need the reference to the current instance (stored
   // in local argument index 0) so Ldfld can load from the correct
   // instance (this one).
   writeStrIL->Emit( OpCodes::Ldarg_0 );
   writeStrIL->Emit( OpCodes::Ldfld, xField );
   
   // Now, we execute the box opcode, which pops the value of field 'x',
   // returning a reference to the integer value boxed as an Object*.
   writeStrIL->Emit( OpCodes::Box, int::typeid );
   
   // Atop the stack, you'll find our String* inStr, followed by a reference
   // to the boxed value of 'x'. Now, you need to likewise box field 'y'.
   writeStrIL->Emit( OpCodes::Ldarg_0 );
   writeStrIL->Emit( OpCodes::Ldfld, yField );
   writeStrIL->Emit( OpCodes::Box, int::typeid );
   
   // Now, you have all of the arguments for your call to
   // Console::WriteLine(String*, Object*, Object*) atop the stack:
   // the String* InStr, a reference to the boxed value of 'x', and
   // a reference to the boxed value of 'y'.
   // Call Console::WriteLine(String*, Object*, Object*) with EmitCall.
   writeStrIL->EmitCall( OpCodes::Call, writeLineMI, nullptr );
   
   // Lastly, EmitWriteLine can also output the value of a field
   // using the overload EmitWriteLine(FieldInfo).
   writeStrIL->EmitWriteLine( "The value of 'x' is:" );
   writeStrIL->EmitWriteLine( xField );
   writeStrIL->EmitWriteLine( "The value of 'y' is:" );
   writeStrIL->EmitWriteLine( yField );
   
   // Since we return no value (void), the ret opcode will not
   // return the top stack value.
   writeStrIL->Emit( OpCodes::Ret );
   return pointTypeBld->CreateType();
}

int main()
{
   array<Object^>^ctorParams = gcnew array<Object^>(2);
   Console::Write( "Enter a integer value for X: " );
   String^ myX = Console::ReadLine();
   Console::Write( "Enter a integer value for Y: " );
   String^ myY = Console::ReadLine();
   Console::WriteLine( "---" );
   ctorParams[ 0 ] = Convert::ToInt32( myX );
   ctorParams[ 1 ] = Convert::ToInt32( myY );
   Type^ ptType = CreateDynamicType();
   Object^ ptInstance = Activator::CreateInstance( ptType, ctorParams );
   ptType->InvokeMember( "WritePoint", BindingFlags::InvokeMethod, nullptr, ptInstance, gcnew array<Object^>(0) );
}

using System;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;

class EmitWriteLineDemo {

   public static Type CreateDynamicType() {
       Type[] ctorParams = new Type[] {typeof(int),
                   typeof(int)};
    
       AppDomain myDomain = Thread.GetDomain();
       AssemblyName myAsmName = new AssemblyName();
       myAsmName.Name = "MyDynamicAssembly";

       AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(
                      myAsmName,
                      AssemblyBuilderAccess.Run);

       ModuleBuilder pointModule = myAsmBuilder.DefineDynamicModule("PointModule",
                                    "Point.dll");

       TypeBuilder pointTypeBld = pointModule.DefineType("Point",
                                  TypeAttributes.Public);

       FieldBuilder xField = pointTypeBld.DefineField("x", typeof(int),
                                                      FieldAttributes.Public);
       FieldBuilder yField = pointTypeBld.DefineField("y", typeof(int),
                                                      FieldAttributes.Public);

       Type objType = Type.GetType("System.Object");
       ConstructorInfo objCtor = objType.GetConstructor(new Type[0]);

       ConstructorBuilder pointCtor = pointTypeBld.DefineConstructor(
                                   MethodAttributes.Public,
                                   CallingConventions.Standard,
                                   ctorParams);
       ILGenerator ctorIL = pointCtor.GetILGenerator();

       // First, you build the constructor.
       ctorIL.Emit(OpCodes.Ldarg_0);
       ctorIL.Emit(OpCodes.Call, objCtor);
       ctorIL.Emit(OpCodes.Ldarg_0);
       ctorIL.Emit(OpCodes.Ldarg_1);
       ctorIL.Emit(OpCodes.Stfld, xField);
       ctorIL.Emit(OpCodes.Ldarg_0);
       ctorIL.Emit(OpCodes.Ldarg_2);
       ctorIL.Emit(OpCodes.Stfld, yField);
       ctorIL.Emit(OpCodes.Ret);

       //  Now, you'll build a method to output some information on the
       // inside your dynamic class. This method will have the following
       // definition in C#:
    //  public void WritePoint()

       MethodBuilder writeStrMthd = pointTypeBld.DefineMethod(
                                     "WritePoint",
                             MethodAttributes.Public,
                                             typeof(void),
                                             null);

       ILGenerator writeStrIL = writeStrMthd.GetILGenerator();

       // The below ILGenerator created demonstrates a few ways to create
       // string output through STDIN.

       // ILGenerator.EmitWriteLine(string) will generate a ldstr and a
       // call to WriteLine for you.

       writeStrIL.EmitWriteLine("The value of this current instance is:");

       // Here, you will do the hard work yourself. First, you need to create
       // the string we will be passing and obtain the correct WriteLine overload
       // for said string. In the below case, you are substituting in two values,
       // so the chosen overload is Console.WriteLine(string, object, object).

       String inStr = "({0}, {1})";
       Type[] wlParams = new Type[] {typeof(string),
                     typeof(object),
                     typeof(object)};

       // We need the MethodInfo to pass into EmitCall later.

       MethodInfo writeLineMI = typeof(Console).GetMethod(
                            "WriteLine",
                        wlParams);

       // Push the string with the substitutions onto the stack.
       // This is the first argument for WriteLine - the string one.

       writeStrIL.Emit(OpCodes.Ldstr, inStr);

       // Since the second argument is an object, and it corresponds to
       // to the substitution for the value of our integer field, you
       // need to box that field to an object. First, push a reference
       // to the current instance, and then push the value stored in
       // field 'x'. We need the reference to the current instance (stored
       // in local argument index 0) so Ldfld can load from the correct
       // instance (this one).

       writeStrIL.Emit(OpCodes.Ldarg_0);
       writeStrIL.Emit(OpCodes.Ldfld, xField);

       // Now, we execute the box opcode, which pops the value of field 'x',
       // returning a reference to the integer value boxed as an object.

       writeStrIL.Emit(OpCodes.Box, typeof(int));

       // Atop the stack, you'll find our string inStr, followed by a reference
       // to the boxed value of 'x'. Now, you need to likewise box field 'y'.

       writeStrIL.Emit(OpCodes.Ldarg_0);
       writeStrIL.Emit(OpCodes.Ldfld, yField);
       writeStrIL.Emit(OpCodes.Box, typeof(int));

       // Now, you have all of the arguments for your call to
       // Console.WriteLine(string, object, object) atop the stack:
       // the string InStr, a reference to the boxed value of 'x', and
       // a reference to the boxed value of 'y'.

       // Call Console.WriteLine(string, object, object) with EmitCall.

       writeStrIL.EmitCall(OpCodes.Call, writeLineMI, null);

       // Lastly, EmitWriteLine can also output the value of a field
       // using the overload EmitWriteLine(FieldInfo).

       writeStrIL.EmitWriteLine("The value of 'x' is:");
       writeStrIL.EmitWriteLine(xField);
       writeStrIL.EmitWriteLine("The value of 'y' is:");
       writeStrIL.EmitWriteLine(yField);

       // Since we return no value (void), the ret opcode will not
       // return the top stack value.

       writeStrIL.Emit(OpCodes.Ret);

       return pointTypeBld.CreateType();
   }

   public static void Main() {

      object[] ctorParams = new object[2];

      Console.Write("Enter a integer value for X: ");
      string myX = Console.ReadLine();
      Console.Write("Enter a integer value for Y: ");
      string myY = Console.ReadLine();

      Console.WriteLine("---");

      ctorParams[0] = Convert.ToInt32(myX);
      ctorParams[1] = Convert.ToInt32(myY);

      Type ptType = CreateDynamicType();

      object ptInstance = Activator.CreateInstance(ptType, ctorParams);
      ptType.InvokeMember("WritePoint",
              BindingFlags.InvokeMethod,
              null,
              ptInstance,
              new object[0]);
   }
}

Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

 _

Class EmitWriteLineDemo
   
   
   Public Shared Function CreateDynamicType() As Type

      Dim ctorParams() As Type = {GetType(Integer), GetType(Integer)}
      
      Dim myDomain As AppDomain = Thread.GetDomain()
      Dim myAsmName As New AssemblyName()
      myAsmName.Name = "MyDynamicAssembly"
      
      Dim myAsmBuilder As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave)
      
      Dim pointModule As ModuleBuilder = myAsmBuilder.DefineDynamicModule("PointModule", "Point.dll")
      
      Dim pointTypeBld As TypeBuilder = pointModule.DefineType("Point", _
                                   TypeAttributes.Public)
      
      Dim xField As FieldBuilder = pointTypeBld.DefineField("x", _
                                GetType(Integer), _
                                FieldAttributes.Public)
      Dim yField As FieldBuilder = pointTypeBld.DefineField("y", _
                                GetType(Integer), _
                                FieldAttributes.Public)
      
      
      Dim objType As Type = Type.GetType("System.Object")
      Dim objCtor As ConstructorInfo = objType.GetConstructor(New Type(){})
      
      Dim pointCtor As ConstructorBuilder = pointTypeBld.DefineConstructor( _
                             MethodAttributes.Public, _
                             CallingConventions.Standard, _
                             ctorParams)
      Dim ctorIL As ILGenerator = pointCtor.GetILGenerator()
      
      
      ' First, you build the constructor.

      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Call, objCtor)
      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Ldarg_1)
      ctorIL.Emit(OpCodes.Stfld, xField)
      ctorIL.Emit(OpCodes.Ldarg_0)
      ctorIL.Emit(OpCodes.Ldarg_2)
      ctorIL.Emit(OpCodes.Stfld, yField)
      ctorIL.Emit(OpCodes.Ret)
      
      '  Now, you'll build a method to output some information on the
      ' inside your dynamic class. This method will have the following
      ' definition in C#:
      '  Public Sub WritePoint() 

      Dim writeStrMthd As MethodBuilder = pointTypeBld.DefineMethod("WritePoint", _
                                    MethodAttributes.Public, _
                                    Nothing, Nothing)
      
      Dim writeStrIL As ILGenerator = writeStrMthd.GetILGenerator()
      
      ' The below ILGenerator created demonstrates a few ways to create
      ' string output through STDIN. 
      ' ILGenerator.EmitWriteLine(string) will generate a ldstr and a 
      ' call to WriteLine for you.

      writeStrIL.EmitWriteLine("The value of this current instance is:")
      
      ' Here, you will do the hard work yourself. First, you need to create
      ' the string we will be passing and obtain the correct WriteLine overload
      ' for said string. In the below case, you are substituting in two values,
      ' so the chosen overload is Console.WriteLine(string, object, object).

      Dim inStr As [String] = "({0}, {1})"
      Dim wlParams() As Type = {GetType(String), GetType(Object), GetType(Object)}
      
      ' We need the MethodInfo to pass into EmitCall later.

      Dim writeLineMI As MethodInfo = GetType(Console).GetMethod("WriteLine", wlParams)
      
      ' Push the string with the substitutions onto the stack.
      ' This is the first argument for WriteLine - the string one. 

      writeStrIL.Emit(OpCodes.Ldstr, inStr)
      
      ' Since the second argument is an object, and it corresponds to
      ' to the substitution for the value of our integer field, you 
      ' need to box that field to an object. First, push a reference
      ' to the current instance, and then push the value stored in
      ' field 'x'. We need the reference to the current instance (stored
      ' in local argument index 0) so Ldfld can load from the correct
      ' instance (this one).

      writeStrIL.Emit(OpCodes.Ldarg_0)
      writeStrIL.Emit(OpCodes.Ldfld, xField)
      
      ' Now, we execute the box opcode, which pops the value of field 'x',
      ' returning a reference to the integer value boxed as an object.

      writeStrIL.Emit(OpCodes.Box, GetType(Integer))
      
      ' Atop the stack, you'll find our string inStr, followed by a reference
      ' to the boxed value of 'x'. Now, you need to likewise box field 'y'.

      writeStrIL.Emit(OpCodes.Ldarg_0)
      writeStrIL.Emit(OpCodes.Ldfld, yField)
      writeStrIL.Emit(OpCodes.Box, GetType(Integer))
      
      ' Now, you have all of the arguments for your call to
      ' Console.WriteLine(string, object, object) atop the stack:
      ' the string InStr, a reference to the boxed value of 'x', and
      ' a reference to the boxed value of 'y'.
      ' Call Console.WriteLine(string, object, object) with EmitCall.

      writeStrIL.EmitCall(OpCodes.Call, writeLineMI, Nothing)
      
      ' Lastly, EmitWriteLine can also output the value of a field
      ' using the overload EmitWriteLine(FieldInfo).

      writeStrIL.EmitWriteLine("The value of 'x' is:")
      writeStrIL.EmitWriteLine(xField)
      writeStrIL.EmitWriteLine("The value of 'y' is:")
      writeStrIL.EmitWriteLine(yField)
      
      ' Since we return no value (void), the ret opcode will not
      ' return the top stack value.

      writeStrIL.Emit(OpCodes.Ret)
      
      Return pointTypeBld.CreateType()

   End Function 'CreateDynamicType
    
   
   Public Shared Sub Main()
      
      Dim ctorParams(1) As Object
      
      Console.Write("Enter a integer value for X: ")
      Dim myX As String = Console.ReadLine()
      Console.Write("Enter a integer value for Y: ")
      Dim myY As String = Console.ReadLine()
      
      Console.WriteLine("---")
      
      ctorParams(0) = Convert.ToInt32(myX)
      ctorParams(1) = Convert.ToInt32(myY)
      
      Dim ptType As Type = CreateDynamicType()

      Dim ptInstance As Object = Activator.CreateInstance(ptType, ctorParams)

      ptType.InvokeMember("WritePoint", _
              BindingFlags.InvokeMethod, _
              Nothing, ptInstance, Nothing)

   End Sub

End Class

Комментарии

Подробное описание кодов операций членов см. в документации по общеязыковой инфраструктуре (CLI), в частности в разделах Partition III: CIL Instruction Set (Раздел III: набор инструкций CIL) и Partition II: Metadata Definition and Semantics (Раздел III: набор инструкций CIL) и Partition II: Metadata Definition and Semantics (Раздел II: определение и семантика метаданных). Дополнительные сведения см. в статье ECMA 335 Common Language Infrastructure (CLI).

Поля

Add

Складывает два значения и помещает результат в стек вычислений.

Add_Ovf

Складывает два целых числа, выполняет проверку переполнения и помещает результат в стек вычислений.

Add_Ovf_Un

Складывает два целочисленных значения без знака, выполняет проверку переполнения и помещает результат в стек вычислений.

And

Вычисляет побитовое И двух значений и помещает результат в стек вычислений.

Arglist

Возвращает неуправляемый указатель на список аргументов текущего метода.

Beq

Передает управление конечной инструкции, если два значения равны.

Beq_S

Передает управление конечной инструкции (короткая форма), если два значения равны.

Bge

Передает управление конечной инструкции, если первое значение больше второго или равно ему.

Bge_S

Передает управление конечной инструкции (короткая форма), если первое значение больше второго или равно ему.

Bge_Un

Передает управление конечной инструкции, если первое значение больше второго (при сравнении целочисленных значений без знака или неупорядоченных значений с плавающей запятой).

Bge_Un_S

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

Bgt

Передает управление конечной инструкции, если первое значение больше второго.

Bgt_S

Передает управление конечной инструкции (короткая форма), если первое значение больше второго.

Bgt_Un

Передает управление конечной инструкции, если первое значение больше второго (при сравнении целочисленных значений без знака или неупорядоченных значений с плавающей запятой).

Bgt_Un_S

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

Ble

Передает управление конечной инструкции, если первое значение меньше второго значения или равно ему.

Ble_S

Передает управление конечной инструкции (короткая форма), если первое значение меньше второго или равно ему.

Ble_Un

Передает управление конечной инструкции, если первое значение меньше второго или равно ему (при сравнении целочисленных значений без знака или неупорядоченных значений с плавающей запятой).

Ble_Un_S

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

Blt

Передает управление конечной инструкции, если первое значение меньше второго.

Blt_S

Передает управление конечной инструкции (короткая форма), если первое значение меньше второго значения.

Blt_Un

Передает управление конечной инструкции, если первое значение меньше второго (при сравнении целочисленных значений без знака или неупорядоченных значений с плавающей запятой).

Blt_Un_S

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

Bne_Un

Передает управление конечной инструкции в случае неравенства двух целочисленных значений без знака или двух неупорядоченных значений с плавающей запятой.

Bne_Un_S

Передает управление конечной инструкции (короткая форма) в случае неравенства двух целочисленных значений без знака или двух неупорядоченных значений с плавающей запятой.

Box

Преобразует тип значения в ссылку на объект (тип O).

Br

Обеспечивает безусловную передачу управления конечной инструкции.

Br_S

Обеспечивает безусловную передачу управления конечной инструкции (короткая форма).

Break

Сообщает инфраструктуре CLI, что необходимо оповестить отладчик о достижении точки останова.

Brfalse

Передает управление конечной инструкции, если значением value является false, пустая ссылка (Nothing в Visual Basic) или ноль.

Brfalse_S

Передает управление конечной инструкции, если значением value является false, пустая ссылка или ноль.

Brtrue

Передает управление конечной инструкции, если значение value равно true, либо отличается от null и от нуля.

Brtrue_S

Передает управление конечной инструкции (короткая форма), если значение value равно true либо отличается от null и от нуля.

Call

Вызывает метод, на который ссылается переданный дескриптор метода.

Calli

Вызывает метод, заданный в стеке вычислений (как указатель на точку входа), с аргументами, описанными в соглашении о вызовах.

Callvirt

Вызывает метод объекта с поздней привязкой и помещает возвращаемое значение в стек вычислений.

Castclass

Предпринимает попытку привести объект, передаваемый по ссылке, к указанному классу.

Ceq

Сравнивает два значения. Если они равны, целочисленное значение 1 ((int32) помещается в стек вычислений; в противном случае в стек вычислений помещается 0 (int32).

Cgt

Сравнивает два значения. Если первое значение больше второго, целочисленное значение 1 ((int32) помещается в стек вычислений; в противном случае в стек вычислений помещается 0 (int32).

Cgt_Un

Сравнивает два значения без знака или два неупорядоченных значения. Если первое значение больше второго, целочисленное значение 1 ((int32) помещается в стек вычислений; в противном случае в стек вычислений помещается 0 (int32).

Ckfinite

Создает исключение ArithmeticException, если значение не является конечным числом.

Clt

Сравнивает два значения. Если первое значение меньше второго, целочисленное значение 1 ((int32) помещается в стек вычислений; в противном случае в стек вычислений помещается 0 (int32).

Clt_Un

Сравнивает два значения без знака или два неупорядоченных значения value1 и value2. Если значение value1 меньше значения value2, целочисленное значение 1 ((int32) помещается в стек вычислений; в противном случае в стек вычислений помещается 0 (int32).

Constrained

Ограничивает тип, для которого был вызван виртуальный метод.

Conv_I

Преобразует верхнее значение в стеке вычислений в тип native int.

Conv_I1

Преобразует верхнее значение в стеке вычислений в int8, а затем расширяет его до int32.

Conv_I2

Преобразует верхнее значение в стеке вычислений в int16, а затем расширяет его до int32.

Conv_I4

Преобразует верхнее значение в стеке вычислений в тип int32.

Conv_I8

Преобразует верхнее значение в стеке вычислений в тип int64.

Conv_Ovf_I

Преобразует значение со знаком на вершине стека вычислений в значение native intи создает исключение OverflowException в случае переполнения.

Conv_Ovf_I_Un

Преобразует значение без знака на вершине стека вычислений в значение native int со знаком и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I1

Преобразует значение со знаком на вершине стека вычислений в значение int8 со знаком, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I1_Un

Преобразует значение без знака на вершине стека вычислений в значение int8 со знаком, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I2

Преобразует значение со знаком на вершине стека вычислений в значение int16 со знаком, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I2_Un

Преобразует значение без знака на вершине стека вычислений в значение int16 со знаком, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I4

Преобразует значение со знаком на вершине стека вычислений в значение int32и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I4_Un

Преобразует значение без знака на вершине стека вычислений в значение int32 со знаком и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I8

Преобразует значение со знаком на вершине стека вычислений в значение int64и создает исключение OverflowException в случае переполнения.

Conv_Ovf_I8_Un

Преобразует значение без знака на вершине стека вычислений в значение int64 со знаком и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U

Преобразует значение со знаком на вершине стека вычислений в unsigned native int и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U_Un

Преобразует значение без знака на вершине стека вычислений в значение unsigned native int и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U1

Преобразует значение со знаком на вершине стека вычислений в значение unsigned int8, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U1_Un

Преобразует значение без знака на вершине стека вычислений в значение unsigned int8, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U2

Преобразует значение со знаком на вершине стека вычислений в значение unsigned int16, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U2_Un

Преобразует значение без знака на вершине стека вычислений в значение unsigned int16, расширяет его до int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U4

Преобразует значение со знаком на вершине стека вычислений в unsigned int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U4_Un

Преобразует значение без знака на вершине стека вычислений в значение unsigned int32 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U8

Преобразует значение со знаком на вершине стека вычислений в unsigned int64 и создает исключение OverflowException в случае переполнения.

Conv_Ovf_U8_Un

Преобразует значение без знака на вершине стека вычислений в значение unsigned int64 и создает исключение OverflowException в случае переполнения.

Conv_R_Un

Преобразование целочисленного значения без знака на вершине стека вычислений в float32.

Conv_R4

Преобразует верхнее значение в стеке вычислений в тип float32.

Conv_R8

Преобразует верхнее значение в стеке вычислений в тип float64.

Conv_U

Преобразует верхнее значение в стеке вычислений в unsigned native int, а затем расширяет его до native int.

Conv_U1

Преобразует верхнее значение в стеке вычислений в unsigned int8, а затем расширяет его до int32.

Conv_U2

Преобразует верхнее значение в стеке вычислений в unsigned int16, а затем расширяет его до int32.

Conv_U4

Преобразует верхнее значение в стеке вычислений в unsigned int32, а затем расширяет его до int32.

Conv_U8

Преобразует верхнее значение в стеке вычислений в unsigned int64, а затем расширяет его до int64.

Cpblk

Копирует заданное число байт из исходного адреса в конечный.

Cpobj

Копирует тип значения, расположенный по адресу объекта (тип , или ), в адрес целевого объекта (тип &или native int).native int&

Div

Делит одно значение на другое и помещает результат в стек вычислений как число с плавающей запятой (с типом F) или как частное (с типом int32).

Div_Un

Делит одно целочисленное значение без знака на другое и помещает результат (int32) в стек вычислений.

Dup

Копирует текущее верхнее значение в стеке вычислений и помещает копию в стек вычислений.

Endfilter

Передает управление из предложения filter исключения обратно в обработчик исключений CLI.

Endfinally

Передает управление из предложения fault или finally блока исключения обратно обработчику исключений CLI.

Initblk

Инициализирует блок памяти с определенным адресом, присваивая его начальному значению с заданным размером.

Initobj

Инициализирует каждое поле типа значения с определенным адресом пустой ссылкой или значением 0 соответствующего простого типа.

Isinst

Проверяет, является ли ссылка на объект (с типом O) экземпляром определенного класса.

Jmp

Прекращает выполнение текущего метода и переходит к заданному методу.

Ldarg

Загружает аргумент (на который ссылается указанное значение индекса) в стек.

Ldarg_0

Загружает аргумент с индексом 0 в стек вычислений.

Ldarg_1

Загружает аргумент с индексом 1 в стек вычислений.

Ldarg_2

Загружает аргумент с индексом 2 в стек вычислений.

Ldarg_3

Загружает аргумент с индексом 3 в стек вычислений.

Ldarg_S

Загружает аргумент (на который ссылается указанное короткое значение индекса) в стек вычислений.

Ldarga

Загружает адрес аргумента в стек вычислений.

Ldarga_S

Загружает адрес аргумента (короткая форма) в стек вычислений.

Ldc_I4

Помещает переданное значение с типом int32 в стек вычислений как int32.

Ldc_I4_0

Помещает целочисленное значение 0 в стек вычислений как int32.

Ldc_I4_1

Помещает целочисленное значение 1 в стек вычислений как int32.

Ldc_I4_2

Помещает целочисленное значение 2 в стек вычислений как int32.

Ldc_I4_3

Помещает целочисленное значение 3 в стек вычислений как int32.

Ldc_I4_4

Помещает целочисленное значение 4 в стек вычислений как int32.

Ldc_I4_5

Помещает целочисленное значение 5 в стек вычислений как int32.

Ldc_I4_6

Помещает целочисленное значение 6 в стек вычислений как int32.

Ldc_I4_7

Помещает целочисленное значение 7 в стек вычислений как int32.

Ldc_I4_8

Помещает целочисленное значение 8 в стек вычислений как int32.

Ldc_I4_M1

Помещает целочисленное значение –1 в стек вычислений как int32.

Ldc_I4_S

Помещает переданное значение с типом int8 в стек вычислений как int32 (короткая форма).

Ldc_I8

Помещает переданное значение с типом int64 в стек вычислений как int64.

Ldc_R4

Помещает переданное значение с типом float32 в стек вычислений как F (число с плавающей запятой).

Ldc_R8

Помещает переданное значение с типом float64 в стек вычислений как F (число с плавающей запятой).

Ldelem

Загружает элемент с заданным индексом массива на вершину стека вычислений в качестве типа, указанного в инструкции.

Ldelem_I

Загружает элемент массива с заданным индексом, имеющий тип native int, на вершину стека вычислений как native int.

Ldelem_I1

Загружает элемент типа int8 с заданным индексом массива на вершину стека вычислений как int32.

Ldelem_I2

Загружает элемент типа int16 с заданным индексом массива на вершину стека вычислений как int32.

Ldelem_I4

Загружает элемент типа int32 с заданным индексом массива на вершину стека вычислений как int32.

Ldelem_I8

Загружает элемент типа int64 с заданным индексом массива на вершину стека вычислений как int64.

Ldelem_R4

Загружает элемент массива с заданным индексом, имеющий тип float32, на вершину стека вычислений как F (число с плавающей запятой).

Ldelem_R8

Загружает элемент массива с заданным индексом, имеющий тип float64, на вершину стека вычислений как F (число с плавающей запятой).

Ldelem_Ref

Загружает элемент массива с заданным индексом, содержащий ссылку на объект, на вершину стека вычислений как O (ссылка на объект).

Ldelem_U1

Загружает элемент типа unsigned int8 с заданным индексом массива на вершину стека вычислений как int32.

Ldelem_U2

Загружает элемент типа unsigned int16 с заданным индексом массива на вершину стека вычислений как int32.

Ldelem_U4

Загружает элемент типа unsigned int32 с заданным индексом массива на вершину стека вычислений как int32.

Ldelema

Загружает адрес элемента массива с заданным индексом на вершину стека вычислений как & (управляемый указатель).

Ldfld

Выполняет поиск значения поля в объекте, ссылка на который находится в стеке вычислений.

Ldflda

Ищет адрес поля в объекте, ссылка на который находится в стеке вычислений.

Ldftn

Помещает в стек вычислений неуправляемый указатель (с типом native int) на машинный код, реализующий заданный метод.

Ldind_I

Выполняет косвенную загрузку значения с типом native int в стек вычислений как native int.

Ldind_I1

Выполняет косвенную загрузку значения с типом int8 в стек вычислений как int32.

Ldind_I2

Выполняет косвенную загрузку значения с типом int16 в стек вычислений как int32.

Ldind_I4

Выполняет косвенную загрузку значения с типом int32 в стек вычислений как int32.

Ldind_I8

Выполняет косвенную загрузку значения с типом int64 в стек вычислений как int64.

Ldind_R4

Выполняет косвенную загрузку значения с типом float32 в стек вычислений как F (число с плавающей запятой).

Ldind_R8

Выполняет косвенную загрузку значения с типом float64 в стек вычислений как F (число с плавающей запятой).

Ldind_Ref

Выполняет косвенную загрузку в стек вычислений ссылки на объект как O (ссылка на объект).

Ldind_U1

Выполняет косвенную загрузку значения с типом unsigned int8 в стек вычислений как int32.

Ldind_U2

Выполняет косвенную загрузку значения с типом unsigned int16 в стек вычислений как int32.

Ldind_U4

Выполняет косвенную загрузку значения с типом unsigned int32 в стек вычислений как int32.

Ldlen

Помещает в стек вычислений сведения о числе элементов одномерного массива с индексацией от нуля.

Ldloc

Загружает в стек вычислений локальную переменную с указанным индексом.

Ldloc_0

Загружает в стек вычислений локальную переменную с индексом 0.

Ldloc_1

Загружает в стек вычислений локальную переменную с индексом 1.

Ldloc_2

Загружает в стек вычислений локальную переменную с индексом 2.

Ldloc_3

Загружает в стек вычислений локальную переменную с индексом 3.

Ldloc_S

Загружает в стек вычислений локальную переменную с указанным индексом (короткая форма).

Ldloca

Загружает в стек вычислений адрес локальной переменной с указанным индексом.

Ldloca_S

Загружает в стек вычислений адрес локальной переменной с указанным индексом (короткая форма).

Ldnull

Помещает в стек вычислений пустую ссылку (тип O).

Ldobj

Копирует объект с типом значения, размещенный по указанному адресу, на вершину стека вычислений.

Ldsfld

Помещает в стек вычислений значение статического поля.

Ldsflda

Помещает в стек вычислений адрес статического поля.

Ldstr

Помещает в стек ссылку на новый объект, представляющий строковой литерал, хранящийся в метаданных.

Ldtoken

Преобразует токен метаданных в его представление времени выполнения, а затем помещает в стек вычислений.

Ldvirtftn

Помещает в стек вычислений неуправляемый указатель (с типом native int) на машинный код, реализующий виртуальный метод, связанный с заданным объектом.

Leave

Выполняет выход из защищенной области кода с безусловной передачей управления указанной конечной инструкции.

Leave_S

Выполняет выход из защищенной области кода с безусловной передачей управления указанной конечной инструкции (короткая форма).

Localloc

Выделяет определенное количество байтов из пула локальной динамической памяти и помещает в стек вычислений адрес (временный указатель с типом *) первого выделенного байта.

Mkrefany

Помещает в стек вычислений ссылку на экземпляр определенного типа.

Mul

Умножает два значения и помещает результат в стек вычислений.

Mul_Ovf

Умножает два целочисленных значения, выполняет проверку переполнения и помещает результат в стек вычислений.

Mul_Ovf_Un

Умножает два целочисленных значения без знака, выполняет проверку переполнения и помещает результат в стек вычислений.

Neg

Отвергает значение и помещает результат в стек вычислений.

Newarr

Помещает в стек вычислений ссылку на объект — новый одномерный массив с индексацией от нуля, состоящий из элементов заданного типа.

Newobj

Создает новый объект или новый экземпляр типа значения и помещает ссылку на объект (тип O) в стек вычислений.

Nop

Заполняет пространство, если коды операции содержат исправления. Никаких значимых операций не выполняется, хотя может быть пройден цикл обработки.

Not

Вычисляет побитовое дополнение целочисленного значения, находящегося на вершине стека, и помещает результат в стек с тем же типом.

Or

Вычисляет побитовое дополнение двух целочисленных значений, находящихся на вершине стека, и помещает результат в стек.

Pop

Удаляет значение, находящееся на вершине стека.

Prefix1

Эта инструкция зарезервирована.

Prefix2

Эта инструкция зарезервирована.

Prefix3

Эта инструкция зарезервирована.

Prefix4

Эта инструкция зарезервирована.

Prefix5

Эта инструкция зарезервирована.

Prefix6

Эта инструкция зарезервирована.

Prefix7

Эта инструкция зарезервирована.

Prefixref

Эта инструкция зарезервирована.

Readonly

Указывает, что последующая операция, связанная с адресом массива, не выполняет никаких проверок во время выполнения и возвращает управляемый указатель, изменение которого запрещено.

Refanytype

Извлекает токен типа, внедренный в ссылку с определенным типом.

Refanyval

Извлекает адрес (тип &), внедренный в ссылку с определенным типом.

Rem

Делит одно значение на другое и помещает остаток в стек вычислений.

Rem_Un

Делит одно значение без знака на другое значение без знака и помещает остаток в стек вычислений.

Ret

Выполняет возврат из текущего метода, помещая возвращаемое значение (если имеется) из стека вычислений вызываемого метода в стек вычислений вызывающего метода.

Rethrow

Возвращает текущее исключение.

Shl

Смещает целочисленное значение влево (с заполнением нулями) на заданное число бит и помещает результат в стек вычислений.

Shr

Смещает целочисленное значение вправо (с знаковым битом) на заданное число бит и помещает результат в стек вычислений.

Shr_Un

Смещает целочисленное значение без знака вправо (с заполнением нулями) на заданное число бит и помещает результат в стек вычислений.

Sizeof

Помещает в стек вычислений сведения о размере (в байтах) заданного типа значения.

Starg

Сохраняет значение, находящееся на вершине стека вычислений, в ячейке аргумента с заданным индексом.

Starg_S

Сохраняет значение, находящееся на вершине стека вычислений, в ячейке аргумента с заданным индексом (короткая форма).

Stelem

Заменяет элемент массива с заданным индексом на значение в стеке вычислений, тип которого указан в инструкции.

Stelem_I

Заменяет элемент массива с заданным индексом на значение native int, находящееся в стеке вычислений.

Stelem_I1

Заменяет элемент массива с заданным индексом на значение int8, находящееся в стеке вычислений.

Stelem_I2

Заменяет элемент массива с заданным индексом на значение int16, находящееся в стеке вычислений.

Stelem_I4

Заменяет элемент массива с заданным индексом на значение int32, находящееся в стеке вычислений.

Stelem_I8

Заменяет элемент массива с заданным индексом на значение int64, находящееся в стеке вычислений.

Stelem_R4

Заменяет элемент массива с заданным индексом на значение float32, находящееся в стеке вычислений.

Stelem_R8

Заменяет элемент массива с заданным индексом на значение float64, находящееся в стеке вычислений.

Stelem_Ref

Заменяет элемент массива с заданным индексом на значение object ref (тип O), находящееся в стеке вычислений.

Stfld

Заменяет значение в поле объекта, по ссылке на объект или указателю, на новое значение.

Stind_I

Сохраняет значение с типом native int по указанному адресу.

Stind_I1

Сохраняет значение с типом int8 по указанному адресу.

Stind_I2

Сохраняет значение с типом int16 по указанному адресу.

Stind_I4

Сохраняет значение с типом int32 по указанному адресу.

Stind_I8

Сохраняет значение с типом int64 по указанному адресу.

Stind_R4

Сохраняет значение с типом float32 по указанному адресу.

Stind_R8

Сохраняет значение с типом float64 по указанному адресу.

Stind_Ref

Сохраняет значение ссылки на объект по указанному адресу.

Stloc

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по указанному индексу.

Stloc_0

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по индексу 0.

Stloc_1

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по индексу 1.

Stloc_2

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по индексу 2.

Stloc_3

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по индексу 3.

Stloc_S

Извлекает текущее значение из верхней части стека вычислений и сохраняет его в списке локальных переменных по адресу index (короткая форма).

Stobj

Копирует значение с заданным типом из стека вычислений в указанный адрес памяти.

Stsfld

Заменяет значение статического поля на значение из стека вычислений.

Sub

Вычитает одно значение из другого и помещает результат в стек вычислений.

Sub_Ovf

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

Sub_Ovf_Un

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

Switch

Реализует таблицу переходов.

Tailcall

Выполняет инструкцию вызова метода (префиксом которой является), предварительно удаляя кадр стека текущего метода.

Throw

Создает объект исключения, находящийся в стеке вычислений.

Unaligned

Указывает, что адрес на вершине стека, возможно, не выровнен по естественному размеру следующей непосредственно за ним инструкции ldind, stind, ldfld, stfld, ldobj, stobj, initblk или cpblk.

Unbox

Преобразует тип значения из упакованной формы в распакованную.

Unbox_Any

Преобразует тип, указанный в инструкции, из упакованной формы в распакованную.

Volatile

Указывает, что адрес на вершине стека вычислений, возможно, является изменяемым и результаты чтения данной области невозможно кэшировать либо невозможно запретить множественные сохранения в эту область.

Xor

Вычисляет побитовое исключающее ИЛИ двух верхних значений в стеке вычислений и помещает результат обратно в стек.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
TakesSingleByteArgument(OpCode)

Возвращает true или false, в зависимости от того, принимает ли заданный код операции однобайтовый аргумент.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к