InstructionEncoder Struct-datatyp
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Kodar instruktioner för common intermediate language (CIL).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Arv
Exempel
Det här exemplet visar hur du genererar en metodtext med hjälp av 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;
}
Kommentarer
Klassen InstructionEncoder används för att generera CIL-instruktioner som utgör en metodtext. Ett fullständigt exempel på hur du genererar en metod finns i klassdokumentationen MetadataBuilder .
Konstruktorer
| Name | Description |
|---|---|
| InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Skapar en kodare som backas upp av kod- och kontrollflödesbyggare. |
Egenskaper
| Name | Description |
|---|---|
| CodeBuilder |
Underliggande byggare där kodade instruktioner skrivs till. |
| ControlFlowBuilder |
Versionsspårningsetiketter, grenar och undantagshanterare. |
| Offset |
Förskjutning av nästa kodade instruktion. |
Metoder
| Name | Description |
|---|---|
| Branch(ILOpCode, LabelHandle) |
Kodar en greninstruktion. |
| Call(EntityHandle) |
Kodar |
| Call(MemberReferenceHandle) |
Kodar |
| Call(MethodDefinitionHandle) |
Kodar |
| Call(MethodSpecificationHandle) |
Kodar |
| CallIndirect(StandaloneSignatureHandle) |
Kodar |
| DefineLabel() |
Definierar en etikett som senare kan användas för att markera och referera till en plats i instruktionsströmmen. |
| LoadArgument(Int32) |
Kodar argumentinläsningsinstruktioner. |
| LoadArgumentAddress(Int32) |
Kodar argumentadressinläsningsinstruktioner. |
| LoadConstantI4(Int32) |
Kodar Int32 konstant inläsningsinstruktion. |
| LoadConstantI8(Int64) |
Kodar Int64 konstant inläsningsinstruktion. |
| LoadConstantR4(Single) |
Kodar Single konstant inläsningsinstruktion. |
| LoadConstantR8(Double) |
Kodar Double konstant inläsningsinstruktion. |
| LoadLocal(Int32) |
Kodar lokal variabelinläsningsinstruktion. |
| LoadLocalAddress(Int32) |
Kodar instruktionen för lokal variabeladressinläsning. |
| LoadString(UserStringHandle) |
Kodar |
| MarkLabel(LabelHandle) |
Associerar den angivna etiketten med den aktuella IL-förskjutningen. |
| OpCode(ILOpCode) |
Kodar angiven op-kod. |
| StoreArgument(Int32) |
Kodar argumentlagringsinstruktioner. |
| StoreLocal(Int32) |
Kodar lokal variabellagringsinstruktion. |
| Switch(Int32) |
Börjar koda en växelinstruktion. |
| Token(EntityHandle) |
Kodar en token. |
| Token(Int32) |
Kodar en token. |