InstructionEncoder Struct
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à
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;
}
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.
Instruction |
Crea un codificatore supportato da generatori di codice e flusso di controllo. |
Code |
Generatore sottostante in cui vengono scritte le istruzioni codificate. |
Control |
Generatore di etichette, rami e gestori di eccezioni. |
Offset |
Offset dell'istruzione codificata successiva. |
Branch(ILOp |
Codifica un'istruzione branch. |
Call(Entity |
Codifica l'istruzione |
Call(Member |
Codifica l'istruzione |
Call(Method |
Codifica l'istruzione |
Call(Method |
Codifica l'istruzione |
Call |
Codifica l'istruzione |
Define |
Definisce un'etichetta che può essere usata in un secondo momento per contrassegnare e fare riferimento a una posizione nel flusso di istruzioni. |
Load |
Codifica l'istruzione di caricamento degli argomenti. |
Load |
Codifica l'istruzione di caricamento dell'indirizzo dell'argomento. |
Load |
Codifica l'istruzione di caricamento della costante Int32. |
Load |
Codifica l'istruzione di caricamento della costante Int64. |
Load |
Codifica l'istruzione di caricamento della costante Single. |
Load |
Codifica l'istruzione di caricamento della costante Double. |
Load |
Codifica l'istruzione di caricamento della variabile locale. |
Load |
Codifica l'istruzione di caricamento dell'indirizzo della variabile locale. |
Load |
Codifica l'istruzione |
Mark |
Associa l'etichetta specificata all'offset IL corrente. |
Op |
Codifica il codice operativo specificato. |
Store |
Codifica l'istruzione di archiviazione dell'argomento. |
Store |
Codifica l'istruzione di archiviazione della variabile locale. |
Switch(Int32) |
Avvia la codifica di un'istruzione switch. |
Token(Entity |
Codifica un token. |
Token(Int32) |
Codifica un token. |
Prodotto | Versioni |
---|---|
.NET | Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8 (package-provided), 8, 9 (package-provided), 9, 10 (package-provided), 10 |
.NET Standard | 2.0 (package-provided) |
Feedback su .NET
.NET è un progetto di open source. Selezionare un collegamento per fornire feedback: