InstructionEncoder Estrutura
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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
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(MemberReferenceHandle) |
Codifica |
| Call(MethodDefinitionHandle) |
Codifica |
| Call(MethodSpecificationHandle) |
Codifica |
| CallIndirect(StandaloneSignatureHandle) |
Codifica |
| 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 |
| 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. |