InstructionEncoder 結構

定義

編碼通用中繼語言 (CIL) 指示。

public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
繼承
InstructionEncoder

範例

此範例示範如何使用 發出方法主體 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;
}

備註

類別 InstructionEncoder 可用來發出組成方法主體的 CIL 指令。 如需發出方法的完整範例,請參閱 MetadataBuilder 類別檔。

建構函式

InstructionEncoder(BlobBuilder, ControlFlowBuilder)

建立程式碼和控制流程產生器支援的編碼器。

屬性

CodeBuilder

要寫入編碼指示的基礎產生器。

ControlFlowBuilder

追蹤標籤、分支和例外狀況處理常式的產生器。

Offset

下一個編碼指令的位移。

方法

Branch(ILOpCode, LabelHandle)

編碼分支指示。

Call(EntityHandle)

編碼 call 指令及其運算元。

Call(MemberReferenceHandle)

編碼 call 指令及其運算元。

Call(MethodDefinitionHandle)

編碼 call 指令及其運算元。

Call(MethodSpecificationHandle)

編碼 call 指令及其運算元。

CallIndirect(StandaloneSignatureHandle)

編碼 calli 指令及其運算元。

DefineLabel()

定義可在稍後用來標記和參考指示資料流中位置的標籤。

LoadArgument(Int32)

編碼引數載入指令。

LoadArgumentAddress(Int32)

編碼引數載入指示。

LoadConstantI4(Int32)

編碼 Int32 常數載入指示。

LoadConstantI8(Int64)

編碼 Int64 常數載入指示。

LoadConstantR4(Single)

編碼 Single 常數載入指示。

LoadConstantR8(Double)

編碼 Double 常數載入指示。

LoadLocal(Int32)

編碼區域變數載入指令。

LoadLocalAddress(Int32)

編碼區域變數位址載入指令。

LoadString(UserStringHandle)

編碼 ldstr 指令及其運算元。

MarkLabel(LabelHandle)

建立指定標籤與目前 IL 位移的關聯。

OpCode(ILOpCode)

編碼指定的作業碼。

StoreArgument(Int32)

編碼引數儲存指示。

StoreLocal(Int32)

編碼區域變數儲存指示。

Switch(Int32)

開始編碼參數指令。

Token(EntityHandle)

編碼權杖。

Token(Int32)

編碼權杖。

適用於