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 Ein Methodentext mithilfe von 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;
}

Hinweise

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

Konstruktoren

Name Beschreibung
InstructionEncoder(BlobBuilder, ControlFlowBuilder)

Erstellt einen Encoder, der von Code- und Steuerungsfluss-Generatoren unterstützt wird.

Eigenschaften

Name Beschreibung
CodeBuilder

Zugrunde liegender Generator, in den codierte Anweisungen geschrieben werden.

ControlFlowBuilder

Generator-Nachverfolgungsbezeichnungen, Verzweigungen und Ausnahmehandler.

Offset

Offset der nächsten codierten Anweisung.

Methoden

Name Beschreibung
Branch(ILOpCode, LabelHandle)

Codiert eine Verzweigungsanweisung.

Call(EntityHandle)

call Codiert Anweisung und operand.

Call(MemberReferenceHandle)

call Codiert Anweisung und operand.

Call(MethodDefinitionHandle)

call Codiert Anweisung und operand.

Call(MethodSpecificationHandle)

call Codiert Anweisung und operand.

CallIndirect(StandaloneSignatureHandle)

calli Codiert Anweisung und operand.

DefineLabel()

Definiert eine Bezeichnung, die später zum Markieren und Verweisen auf eine Position im Anweisungsstream verwendet werden kann.

LoadArgument(Int32)

Codiert die Ladeanweisung des Arguments.

LoadArgumentAddress(Int32)

Codiert die Argumentadressenladeanweisung.

LoadConstantI4(Int32)

Int32 Codiert konstante Ladeanweisung.

LoadConstantI8(Int64)

Int64 Codiert konstante Ladeanweisung.

LoadConstantR4(Single)

Single Codiert konstante Ladeanweisung.

LoadConstantR8(Double)

Double Codiert konstante Ladeanweisung.

LoadLocal(Int32)

Codiert lokale Load-Anweisung für Variable.

LoadLocalAddress(Int32)

Codiert die Anweisung zum Laden der lokalen Variablenadresse.

LoadString(UserStringHandle)

ldstr Codiert Anweisung und operand.

MarkLabel(LabelHandle)

Ordnet die angegebene Beschriftung dem aktuellen IL-Offset zu.

OpCode(ILOpCode)

Codiert den angegebenen Op-Code.

StoreArgument(Int32)

Codiert die Anweisung zum Speichern von Argumenten.

StoreLocal(Int32)

Codiert die Anweisung für den lokalen Variablenspeicher.

Switch(Int32)

Startet die Codierung einer Switch-Anweisung.

Token(EntityHandle)

Codiert ein Token.

Token(Int32)

Codiert ein Token.

Gilt für: