Freigeben über


InstructionEncoder Struktur

Definition

Codiert CIL-Anweisungen (Common Intermediate Language).

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

Beispiele

In diesem Beispiel wird gezeigt, wie Sie einen Methodentext mit InstructionEncoderausgeben:

// 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;
}

Hinweise

Die InstructionEncoder -Klasse wird verwendet, um CIL-Anweisungen auszugeben, die einen Methodentext bilden. Ein vollständiges Beispiel für das Ausgeben einer Methode finden Sie in der Dokumentation zur MetadataBuilder Klasse.

Konstruktoren

InstructionEncoder(BlobBuilder, ControlFlowBuilder)

Erstellt einen durch Code und Ablaufsteuerungsgeneratoren gestützten Encoder.

Eigenschaften

CodeBuilder

Zugrundeliegender Generator, in den codierte Anweisungen geschrieben werden.

ControlFlowBuilder

Generator-Nachverfolgungsbezeichnungen, Branches und Ausnahmehandler.

Offset

Offset der nächsten codierten Anweisung.

Methoden

Branch(ILOpCode, LabelHandle)

Codiert eine Verzweigungsanweisung.

Call(EntityHandle)

call Codiert die Anweisung und den Operanden.

Call(MemberReferenceHandle)

call Codiert die Anweisung und den Operanden.

Call(MethodDefinitionHandle)

call Codiert die Anweisung und den Operanden.

Call(MethodSpecificationHandle)

call Codiert die Anweisung und den Operanden.

CallIndirect(StandaloneSignatureHandle)

calli Codiert die Anweisung und den Operanden.

DefineLabel()

Definiert eine Bezeichnung, die später verwendet werden kann, um einen Speicherort im Anweisungsstream zu markieren und auf ihn zu verweisen.

LoadArgument(Int32)

Codiert die Ladeanweisung des Arguments.

LoadArgumentAddress(Int32)

Codiert die Ladeanweisung der Argumentadresse.

LoadConstantI4(Int32)

Codiert die Ladeanweisung der Int32-Konstante.

LoadConstantI8(Int64)

Codiert die Ladeanweisung der Int64-Konstante.

LoadConstantR4(Single)

Codiert die Ladeanweisung der Single-Konstante.

LoadConstantR8(Double)

Codiert die Ladeanweisung der Double-Konstante.

LoadLocal(Int32)

Codiert die Ladeanweisung für lokale Variablen.

LoadLocalAddress(Int32)

Codiert die Ladeanweisung für Adressen von lokalen Variablen.

LoadString(UserStringHandle)

ldstr Codiert die Anweisung und den Operanden.

MarkLabel(LabelHandle)

Ordnet die angegebene Bezeichnung dem aktuellen IL-Offset zu.

OpCode(ILOpCode)

Codiert den angegebenen Op-Code.

StoreArgument(Int32)

Codiert die Speicheranweisung des Arguments.

StoreLocal(Int32)

Codiert die Speicheranweisung für lokale Variablen.

Switch(Int32)

Startet die Codierung einer Switch-Anweisung.

Token(EntityHandle)

Codiert ein Token.

Token(Int32)

Codiert ein Token.

Gilt für: