InstructionEncoder Struct
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Codifica le istruzioni di Common Intermediate Language (CIL).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Ereditarietà
Esempio
In questo esempio viene illustrato come generare un corpo del metodo 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;
}
Commenti
La InstructionEncoder classe viene usata per generare istruzioni CIL che costituiscono un corpo del metodo. Per un esempio completo di creazione di un metodo, vedere la documentazione della MetadataBuilder classe.
Costruttori
InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Crea un codificatore supportato da generatori di codice e flusso di controllo. |
Proprietà
CodeBuilder |
Generatore sottostante in cui vengono scritte le istruzioni codificate. |
ControlFlowBuilder |
Generatore di etichette, rami e gestori di eccezioni. |
Offset |
Offset dell'istruzione codificata successiva. |
Metodi
Branch(ILOpCode, LabelHandle) |
Codifica un'istruzione branch. |
Call(EntityHandle) |
Codifica l'istruzione |
Call(MemberReferenceHandle) |
Codifica l'istruzione |
Call(MethodDefinitionHandle) |
Codifica l'istruzione |
Call(MethodSpecificationHandle) |
Codifica l'istruzione |
CallIndirect(StandaloneSignatureHandle) |
Codifica l'istruzione |
DefineLabel() |
Definisce un'etichetta che può essere usata in un secondo momento per contrassegnare e fare riferimento a una posizione nel flusso di istruzioni. |
LoadArgument(Int32) |
Codifica l'istruzione di caricamento degli argomenti. |
LoadArgumentAddress(Int32) |
Codifica l'istruzione di caricamento dell'indirizzo dell'argomento. |
LoadConstantI4(Int32) |
Codifica l'istruzione di caricamento della costante Int32. |
LoadConstantI8(Int64) |
Codifica l'istruzione di caricamento della costante Int64. |
LoadConstantR4(Single) |
Codifica l'istruzione di caricamento della costante Single. |
LoadConstantR8(Double) |
Codifica l'istruzione di caricamento della costante Double. |
LoadLocal(Int32) |
Codifica l'istruzione di caricamento della variabile locale. |
LoadLocalAddress(Int32) |
Codifica l'istruzione di caricamento dell'indirizzo della variabile locale. |
LoadString(UserStringHandle) |
Codifica l'istruzione |
MarkLabel(LabelHandle) |
Associa l'etichetta specificata all'offset IL corrente. |
OpCode(ILOpCode) |
Codifica il codice operativo specificato. |
StoreArgument(Int32) |
Codifica l'istruzione di archiviazione dell'argomento. |
StoreLocal(Int32) |
Codifica l'istruzione di archiviazione della variabile locale. |
Switch(Int32) |
Avvia la codifica di un'istruzione switch. |
Token(EntityHandle) |
Codifica un token. |
Token(Int32) |
Codifica un token. |