InstructionEncoder Struktura
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Kóduje pokyny CIL (Common Intermediate Language).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Dědičnost
Příklady
Tento příklad ukazuje, jak generovat tělo metody pomocí 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;
}
Poznámky
Třída InstructionEncoder se používá ke generování instrukcí CIL, které tvoří tělo metody. Úplný příklad generování metody najdete v dokumentaci ke MetadataBuilder třídě.
Konstruktory
InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Vytvoří kodér založený na tvůrcích kódu a toku řízení. |
Vlastnosti
CodeBuilder |
Základní tvůrce, do kterého se zapisují kódované instrukce. |
ControlFlowBuilder |
Popisky sledování, větve a obslužné rutiny výjimek v Tvůrci |
Offset |
Posun další kódované instrukce. |
Metody
Branch(ILOpCode, LabelHandle) |
Zakóduje instrukci větve. |
Call(EntityHandle) |
Kóduje |
Call(MemberReferenceHandle) |
Kóduje |
Call(MethodDefinitionHandle) |
Kóduje |
Call(MethodSpecificationHandle) |
Kóduje |
CallIndirect(StandaloneSignatureHandle) |
Kóduje |
DefineLabel() |
Definuje popisek, který lze později použít k označení a odkazování na umístění v instrukčním streamu. |
LoadArgument(Int32) |
Kóduje instrukce načtení argumentu. |
LoadArgumentAddress(Int32) |
Kóduje instrukce načtení adresy argumentu. |
LoadConstantI4(Int32) |
Kóduje Int32 instrukce konstantního načítání. |
LoadConstantI8(Int64) |
Kóduje Int64 instrukce konstantního načítání. |
LoadConstantR4(Single) |
Kóduje Single instrukce konstantního načítání. |
LoadConstantR8(Double) |
Kóduje Double instrukce konstantního načítání. |
LoadLocal(Int32) |
Kóduje instrukce načtení místních proměnných. |
LoadLocalAddress(Int32) |
Kóduje instrukce načtení adresy místní proměnné. |
LoadString(UserStringHandle) |
Kóduje |
MarkLabel(LabelHandle) |
Přidruží zadaný popisek k aktuálnímu posunu IL. |
OpCode(ILOpCode) |
Kóduje zadaný operační kód. |
StoreArgument(Int32) |
Kóduje instrukce úložiště argumentů. |
StoreLocal(Int32) |
Kóduje instrukce úložiště místních proměnných. |
Switch(Int32) |
Spustí kódování instrukce přepínače. |
Token(EntityHandle) |
Kóduje token. |
Token(Int32) |
Kóduje token. |