InstructionEncoder Estrutura
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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
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(MemberReferenceHandle) |
Codifica a |
| Call(MethodDefinitionHandle) |
Codifica a |
| Call(MethodSpecificationHandle) |
Codifica a |
| CallIndirect(StandaloneSignatureHandle) |
Codifica a |
| 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 |
| 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. |