InstructionEncoder Estrutura

Definição

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

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

Comentários

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

Construtores

Nome Description
InstructionEncoder(BlobBuilder, ControlFlowBuilder)

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

Propriedades

Nome Description
CodeBuilder

Construtor subjacente no qual as instruções codificadas são gravadas.

ControlFlowBuilder

Rótulos de acompanhamento do construtor, branches e manipuladores de exceção.

Offset

Deslocamento da próxima instrução codificada.

Métodos

Nome Description
Branch(ILOpCode, LabelHandle)

Codifica uma instrução de branch.

Call(EntityHandle)

Codifica a call instrução e seu operando.

Call(MemberReferenceHandle)

Codifica a call instrução e seu operando.

Call(MethodDefinitionHandle)

Codifica a call instrução e seu operando.

Call(MethodSpecificationHandle)

Codifica a call instrução e seu operando.

CallIndirect(StandaloneSignatureHandle)

Codifica a calli instrução e seu operando.

DefineLabel()

Define um rótulo que pode ser usado posteriormente para marcar e fazer referência a um local no fluxo de instruções.

LoadArgument(Int32)

Codifica a instrução de carregamento de argumento.

LoadArgumentAddress(Int32)

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

LoadConstantI4(Int32)

Codifica a Int32 instrução de carga constante.

LoadConstantI8(Int64)

Codifica a Int64 instrução de carga constante.

LoadConstantR4(Single)

Codifica a Single instrução de carga constante.

LoadConstantR8(Double)

Codifica a Double instrução de carga constante.

LoadLocal(Int32)

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

LoadLocalAddress(Int32)

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

LoadString(UserStringHandle)

Codifica a ldstr instrução e seu operando.

MarkLabel(LabelHandle)

Associa o rótulo especificado ao deslocamento il atual.

OpCode(ILOpCode)

Codifica o código op especificado.

StoreArgument(Int32)

Codifica a instrução do repositório de argumentos.

StoreLocal(Int32)

Codifica a instrução do repositório de variáveis local.

Switch(Int32)

Inicia a codificação de uma instrução de comutador.

Token(EntityHandle)

Codifica um token.

Token(Int32)

Codifica um token.

Aplica-se a