Aracılığıyla paylaş


InstructionEncoder Yapı

Tanım

Ortak Ara Dil (CIL) yönergelerini kodlar.

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

Örnekler

Bu örnekte kullanarak InstructionEncoderbir yöntem gövdesini yayma gösterilmektedir:

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

Açıklamalar

InstructionEncoder sınıfı, yöntem gövdesini oluşturan CIL yönergelerini yaymak için kullanılır. Yöntem yayma işleminin tam bir örneği için sınıf belgelerine MetadataBuilder bakın.

Oluşturucular

InstructionEncoder(BlobBuilder, ControlFlowBuilder)

Kod ve denetim akışı oluşturucuları tarafından yedeklenen bir kodlayıcı oluşturur.

Özellikler

CodeBuilder

Kodlanmış yönergelerin yazıldığı temel oluşturucu.

ControlFlowBuilder

Oluşturucu izleme etiketleri, dallar ve özel durum işleyicileri.

Offset

Sonraki kodlanmış yönergenin uzaklığı.

Yöntemler

Branch(ILOpCode, LabelHandle)

Dal yönergesi kodlar.

Call(EntityHandle)

Yönergeyi ve işlenenini kodlar call .

Call(MemberReferenceHandle)

Yönergeyi ve işlenenini kodlar call .

Call(MethodDefinitionHandle)

Yönergeyi ve işlenenini kodlar call .

Call(MethodSpecificationHandle)

Yönergeyi ve işlenenini kodlar call .

CallIndirect(StandaloneSignatureHandle)

Yönergeyi ve işlenenini kodlar calli .

DefineLabel()

Daha sonra yönerge akışındaki bir konumu işaretlemek ve buna başvurmak için kullanılabilecek bir etiket tanımlar.

LoadArgument(Int32)

Bağımsız değişken yükleme yönergesi kodlar.

LoadArgumentAddress(Int32)

Bağımsız değişken adresi yükleme yönergesi kodlar.

LoadConstantI4(Int32)

Sabit yük yönergesi kodlar Int32 .

LoadConstantI8(Int64)

Sabit yük yönergesi kodlar Int64 .

LoadConstantR4(Single)

Sabit yük yönergesi kodlar Single .

LoadConstantR8(Double)

Sabit yük yönergesi kodlar Double .

LoadLocal(Int32)

Yerel değişken yükleme yönergesi kodlar.

LoadLocalAddress(Int32)

Yerel değişken adres yükleme yönergesi kodlar.

LoadString(UserStringHandle)

Yönergeyi ve işlenenini kodlar ldstr .

MarkLabel(LabelHandle)

Belirtilen etiketi geçerli IL uzaklığıyla ilişkilendirir.

OpCode(ILOpCode)

Belirtilen op-code kodunu kodlar.

StoreArgument(Int32)

Bağımsız değişken deposu yönergesi kodlar.

StoreLocal(Int32)

Yerel değişken deposu yönergesi kodlar.

Switch(Int32)

Anahtar yönergesi kodlamayı başlatır.

Token(EntityHandle)

Bir belirteci kodlar.

Token(Int32)

Bir belirteci kodlar.

Şunlara uygulanır