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 Ein Methodentext mithilfe von 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;
}
Hinweise
Die InstructionEncoder Klasse wird verwendet, um CIL-Anweisungen auszugeben, die einen Methodentext bilden. Ein vollständiges Beispiel für das Ausstellen einer Methode finden Sie in der MetadataBuilder Klassendokumentation.
Konstruktoren
| Name | Beschreibung |
|---|---|
| InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Erstellt einen Encoder, der von Code- und Steuerungsfluss-Generatoren unterstützt wird. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| CodeBuilder |
Zugrunde liegender Generator, in den codierte Anweisungen geschrieben werden. |
| ControlFlowBuilder |
Generator-Nachverfolgungsbezeichnungen, Verzweigungen und Ausnahmehandler. |
| Offset |
Offset der nächsten codierten Anweisung. |
Methoden
| Name | Beschreibung |
|---|---|
| Branch(ILOpCode, LabelHandle) |
Codiert eine Verzweigungsanweisung. |
| Call(EntityHandle) |
|
| Call(MemberReferenceHandle) |
|
| Call(MethodDefinitionHandle) |
|
| Call(MethodSpecificationHandle) |
|
| CallIndirect(StandaloneSignatureHandle) |
|
| DefineLabel() |
Definiert eine Bezeichnung, die später zum Markieren und Verweisen auf eine Position im Anweisungsstream verwendet werden kann. |
| LoadArgument(Int32) |
Codiert die Ladeanweisung des Arguments. |
| LoadArgumentAddress(Int32) |
Codiert die Argumentadressenladeanweisung. |
| LoadConstantI4(Int32) |
Int32 Codiert konstante Ladeanweisung. |
| LoadConstantI8(Int64) |
Int64 Codiert konstante Ladeanweisung. |
| LoadConstantR4(Single) |
Single Codiert konstante Ladeanweisung. |
| LoadConstantR8(Double) |
Double Codiert konstante Ladeanweisung. |
| LoadLocal(Int32) |
Codiert lokale Load-Anweisung für Variable. |
| LoadLocalAddress(Int32) |
Codiert die Anweisung zum Laden der lokalen Variablenadresse. |
| LoadString(UserStringHandle) |
|
| MarkLabel(LabelHandle) |
Ordnet die angegebene Beschriftung dem aktuellen IL-Offset zu. |
| OpCode(ILOpCode) |
Codiert den angegebenen Op-Code. |
| StoreArgument(Int32) |
Codiert die Anweisung zum Speichern von Argumenten. |
| StoreLocal(Int32) |
Codiert die Anweisung für den lokalen Variablenspeicher. |
| Switch(Int32) |
Startet die Codierung einer Switch-Anweisung. |
| Token(EntityHandle) |
Codiert ein Token. |
| Token(Int32) |
Codiert ein Token. |