InstructionEncoder Struktur
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Codiert CIL-Anweisungen (Common Intermediate Language).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Vererbung
Beispiele
In diesem Beispiel wird gezeigt, wie Sie einen Methodentext mit InstructionEncoderausgeben:
// 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;
}
Hinweise
Die InstructionEncoder -Klasse wird verwendet, um CIL-Anweisungen auszugeben, die einen Methodentext bilden. Ein vollständiges Beispiel für das Ausgeben einer Methode finden Sie in der Dokumentation zur MetadataBuilder Klasse.
Konstruktoren
InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Erstellt einen durch Code und Ablaufsteuerungsgeneratoren gestützten Encoder. |
Eigenschaften
CodeBuilder |
Zugrundeliegender Generator, in den codierte Anweisungen geschrieben werden. |
ControlFlowBuilder |
Generator-Nachverfolgungsbezeichnungen, Branches und Ausnahmehandler. |
Offset |
Offset der nächsten codierten Anweisung. |
Methoden
Branch(ILOpCode, LabelHandle) |
Codiert eine Verzweigungsanweisung. |
Call(EntityHandle) |
|
Call(MemberReferenceHandle) |
|
Call(MethodDefinitionHandle) |
|
Call(MethodSpecificationHandle) |
|
CallIndirect(StandaloneSignatureHandle) |
|
DefineLabel() |
Definiert eine Bezeichnung, die später verwendet werden kann, um einen Speicherort im Anweisungsstream zu markieren und auf ihn zu verweisen. |
LoadArgument(Int32) |
Codiert die Ladeanweisung des Arguments. |
LoadArgumentAddress(Int32) |
Codiert die Ladeanweisung der Argumentadresse. |
LoadConstantI4(Int32) |
Codiert die Ladeanweisung der Int32-Konstante. |
LoadConstantI8(Int64) |
Codiert die Ladeanweisung der Int64-Konstante. |
LoadConstantR4(Single) |
Codiert die Ladeanweisung der Single-Konstante. |
LoadConstantR8(Double) |
Codiert die Ladeanweisung der Double-Konstante. |
LoadLocal(Int32) |
Codiert die Ladeanweisung für lokale Variablen. |
LoadLocalAddress(Int32) |
Codiert die Ladeanweisung für Adressen von lokalen Variablen. |
LoadString(UserStringHandle) |
|
MarkLabel(LabelHandle) |
Ordnet die angegebene Bezeichnung dem aktuellen IL-Offset zu. |
OpCode(ILOpCode) |
Codiert den angegebenen Op-Code. |
StoreArgument(Int32) |
Codiert die Speicheranweisung des Arguments. |
StoreLocal(Int32) |
Codiert die Speicheranweisung für lokale Variablen. |
Switch(Int32) |
Startet die Codierung einer Switch-Anweisung. |
Token(EntityHandle) |
Codiert ein Token. |
Token(Int32) |
Codiert ein Token. |