InstructionEncoder Estrutura

Definição

Codifica instruções da Common Intermediate Language (CIL).

public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
Herança
InstructionEncoder

Exemplos

Este exemplo mostra como emitir um corpo de método usando 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;
}

Observações

A InstructionEncoder classe é usada para emitir instruções CIL que compõem um corpo de método. Para um exemplo completo de emissão de um método, consulte a documentação da MetadataBuilder classe.

Construtores

Name Description
InstructionEncoder(BlobBuilder, ControlFlowBuilder)

Cria um codificador apoiado por construtores de código e controlo-fluxo.

Propriedades

Name Description
CodeBuilder

Construtor subjacente onde são escritas instruções codificadas.

ControlFlowBuilder

Etiquetas de rastreamento do construtor, ramificações e manipuladores de exceções.

Offset

Deslocamento da próxima instrução codificada.

Métodos

Name Description
Branch(ILOpCode, LabelHandle)

Codifica uma instrução de ramificação.

Call(EntityHandle)

Codifica call a instrução e o seu operando.

Call(MemberReferenceHandle)

Codifica call a instrução e o seu operando.

Call(MethodDefinitionHandle)

Codifica call a instrução e o seu operando.

Call(MethodSpecificationHandle)

Codifica call a instrução e o seu operando.

CallIndirect(StandaloneSignatureHandle)

Codifica calli a instrução e o seu operando.

DefineLabel()

Define um rótulo que pode ser usado posteriormente para assinalar e referir-se a uma localização no fluxo de instruções.

LoadArgument(Int32)

Codifica a instrução de carga de argumentos.

LoadArgumentAddress(Int32)

Codifica a instrução de carregamento do endereço do argumento.

LoadConstantI4(Int32)

Codifica Int32 instruções de carregamento constante.

LoadConstantI8(Int64)

Codifica Int64 instruções de carregamento constante.

LoadConstantR4(Single)

Codifica Single instruções de carregamento constante.

LoadConstantR8(Double)

Codifica Double instruções de carregamento constante.

LoadLocal(Int32)

Codifica a instrução de carga variável local.

LoadLocalAddress(Int32)

Codifica a instrução de carregamento de endereço de variável local.

LoadString(UserStringHandle)

Codifica ldstr a instrução e o seu operando.

MarkLabel(LabelHandle)

Associa o rótulo especificado ao offset IL atual.

OpCode(ILOpCode)

Codifica o código operacional especificado.

StoreArgument(Int32)

Codifica a instrução de armazenamento de argumentos.

StoreLocal(Int32)

Codifica a instrução local de armazenamento de variáveis.

Switch(Int32)

Começa a codificar uma instrução de switch.

Token(EntityHandle)

Codifica um token.

Token(Int32)

Codifica um token.

Aplica-se a