InstructionEncoder 結構

定義

編碼常見的中繼語言 (CIL) 指示。

public readonly struct InstructionEncoder
public struct 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)

編碼令牌。

適用於

產品 版本
.NET Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8 (package-provided), 8, 9 (package-provided), 9
.NET Framework 4.7 (package-provided), 4.7.1 (package-provided), 4.7.2 (package-provided), 4.8 (package-provided)
.NET Standard 2.0 (package-provided)