Bagikan melalui


InstructionEncoder Struktur

Definisi

Mengodekan instruksi Common Intermediate Language (CIL).

public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
Warisan
InstructionEncoder

Contoh

Contoh ini menunjukkan cara memancarkan isi metode menggunakan InstructionEncoder:

// The following code emits a method body similar to this C# code:

/*public static double CalcRectangleArea(double length, double width)
{
    if (length < 0.0)
    {
        throw new ArgumentOutOfRangeException("length");
    }

    if (width < 0.0)
    {
        throw new ArgumentOutOfRangeException("width");
    }

    return length * width;
}*/

private static InstructionEncoder EmitMethodBody(MetadataBuilder metadata, AssemblyReferenceHandle corlibAssemblyRef)
{
    var codeBuilder = new BlobBuilder();
    var encoder = new InstructionEncoder(codeBuilder, new ControlFlowBuilder());

    // Get a reference to the System.ArgumentOutOfRangeException type
    TypeReferenceHandle typeRefHandle = metadata.AddTypeReference(
    corlibAssemblyRef,
    metadata.GetOrAddString("System"),
    metadata.GetOrAddString("ArgumentOutOfRangeException"));

    // Signature: .ctor(string)
    var ctorSignature = new BlobBuilder();

    new BlobEncoder(ctorSignature).
        MethodSignature(isInstanceMethod: true).
        Parameters(1, returnType => returnType.Void(), parameters => parameters.AddParameter().Type().String());

    BlobHandle ctorBlobIndex = metadata.GetOrAddBlob(ctorSignature);

    // Get a reference to the System.ArgumentOutOfRangeException constructor
    MemberReferenceHandle ctorMemberRef = metadata.AddMemberReference(
        typeRefHandle,
        metadata.GetOrAddString(".ctor"),
        ctorBlobIndex);

    LabelHandle label1 = encoder.DefineLabel();
    LabelHandle label2 = encoder.DefineLabel();

    // ldarg.0
    encoder.OpCode(ILOpCode.Ldarg_0);

    // ldc.r8 0
    encoder.LoadConstantR8(0);

    // bge.un.s LABEL1
    encoder.Branch(ILOpCode.Bge_un_s, label1);

    // ldstr "length"
    encoder.LoadString(metadata.GetOrAddUserString("length"));

    // newobj instance void [System.Runtime]System.ArgumentOutOfRangeException::.ctor(string)
    encoder.OpCode(ILOpCode.Newobj);
    encoder.Token(ctorMemberRef);

    // throw
    encoder.OpCode(ILOpCode.Throw);

    // LABEL1: ldarg.1
    encoder.MarkLabel(label1);
    encoder.OpCode(ILOpCode.Ldarg_1);

    // ldc.r8 0
    encoder.LoadConstantR8(0);

    // bge.un.s LABEL2
    encoder.Branch(ILOpCode.Bge_un_s, label2);

    // ldstr "width"
    encoder.LoadString(metadata.GetOrAddUserString("width"));

    // newobj instance void [System.Runtime]System.ArgumentOutOfRangeException::.ctor(string)
    encoder.OpCode(ILOpCode.Newobj);
    encoder.Token(ctorMemberRef);

    // throw
    encoder.OpCode(ILOpCode.Throw);

    // LABEL2: ldarg.0
    encoder.MarkLabel(label2);
    encoder.OpCode(ILOpCode.Ldarg_0);

    // ldarg.1
    encoder.OpCode(ILOpCode.Ldarg_1);

    // mul
    encoder.OpCode(ILOpCode.Mul);

    // ret
    encoder.OpCode(ILOpCode.Ret);

    return encoder;
}

Keterangan

Kelas InstructionEncoder ini digunakan untuk memancarkan instruksi CIL yang membentuk isi metode. Untuk contoh lengkap memancarkan metode, lihat MetadataBuilder dokumentasi kelas.

Konstruktor

InstructionEncoder(BlobBuilder, ControlFlowBuilder)

Membuat encoder yang didukung oleh penyusun kode dan aliran kontrol.

Properti

CodeBuilder

Penyusun yang mendasar tempat instruksi yang dikodekan ditulis.

ControlFlowBuilder

Label pelacakan penyusun, cabang, dan penangan pengecualian.

Offset

Offset dari instruksi yang dikodekan berikutnya.

Metode

Branch(ILOpCode, LabelHandle)

Mengodekan instruksi cabang.

Call(EntityHandle)

Mengodekan call instruksi dan operand-nya.

Call(MemberReferenceHandle)

Mengodekan call instruksi dan operand-nya.

Call(MethodDefinitionHandle)

Mengodekan call instruksi dan operand-nya.

Call(MethodSpecificationHandle)

Mengodekan call instruksi dan operand-nya.

CallIndirect(StandaloneSignatureHandle)

Mengodekan calli instruksi dan operand-nya.

DefineLabel()

Menentukan label yang nantinya dapat digunakan untuk menandai dan merujuk ke lokasi di aliran instruksi.

LoadArgument(Int32)

Mengodekan instruksi beban argumen.

LoadArgumentAddress(Int32)

Mengodekan instruksi beban alamat argumen.

LoadConstantI4(Int32)

Mengodekan Int32 instruksi beban konstan.

LoadConstantI8(Int64)

Mengodekan Int64 instruksi beban konstan.

LoadConstantR4(Single)

Mengodekan Single instruksi beban konstan.

LoadConstantR8(Double)

Mengodekan Double instruksi beban konstan.

LoadLocal(Int32)

Mengodekan instruksi beban variabel lokal.

LoadLocalAddress(Int32)

Mengodekan instruksi beban alamat variabel lokal.

LoadString(UserStringHandle)

Mengodekan ldstr instruksi dan operand-nya.

MarkLabel(LabelHandle)

Mengaitkan label yang ditentukan dengan offset IL saat ini.

OpCode(ILOpCode)

Mengodekan op-code yang ditentukan.

StoreArgument(Int32)

Mengodekan instruksi penyimpanan argumen.

StoreLocal(Int32)

Mengodekan instruksi penyimpanan variabel lokal.

Switch(Int32)

Mulai mengodekan instruksi switch.

Token(EntityHandle)

Mengodekan token.

Token(Int32)

Mengodekan token.

Berlaku untuk