InstructionEncoder Yapı
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Ortak Ara Dil (CIL) yönergelerini kodlar.
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Devralma
Örnekler
Bu örnekte kullanarak InstructionEncoderbir yöntem gövdesini yayma gösterilmektedir:
// 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;
}
Açıklamalar
InstructionEncoder sınıfı, yöntem gövdesini oluşturan CIL yönergelerini yaymak için kullanılır. Yöntem yayma işleminin tam bir örneği için sınıf belgelerine MetadataBuilder bakın.
Oluşturucular
InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Kod ve denetim akışı oluşturucuları tarafından yedeklenen bir kodlayıcı oluşturur. |
Özellikler
CodeBuilder |
Kodlanmış yönergelerin yazıldığı temel oluşturucu. |
ControlFlowBuilder |
Oluşturucu izleme etiketleri, dallar ve özel durum işleyicileri. |
Offset |
Sonraki kodlanmış yönergenin uzaklığı. |
Yöntemler
Branch(ILOpCode, LabelHandle) |
Dal yönergesi kodlar. |
Call(EntityHandle) |
Yönergeyi ve işlenenini kodlar |
Call(MemberReferenceHandle) |
Yönergeyi ve işlenenini kodlar |
Call(MethodDefinitionHandle) |
Yönergeyi ve işlenenini kodlar |
Call(MethodSpecificationHandle) |
Yönergeyi ve işlenenini kodlar |
CallIndirect(StandaloneSignatureHandle) |
Yönergeyi ve işlenenini kodlar |
DefineLabel() |
Daha sonra yönerge akışındaki bir konumu işaretlemek ve buna başvurmak için kullanılabilecek bir etiket tanımlar. |
LoadArgument(Int32) |
Bağımsız değişken yükleme yönergesi kodlar. |
LoadArgumentAddress(Int32) |
Bağımsız değişken adresi yükleme yönergesi kodlar. |
LoadConstantI4(Int32) |
Sabit yük yönergesi kodlar Int32 . |
LoadConstantI8(Int64) |
Sabit yük yönergesi kodlar Int64 . |
LoadConstantR4(Single) |
Sabit yük yönergesi kodlar Single . |
LoadConstantR8(Double) |
Sabit yük yönergesi kodlar Double . |
LoadLocal(Int32) |
Yerel değişken yükleme yönergesi kodlar. |
LoadLocalAddress(Int32) |
Yerel değişken adres yükleme yönergesi kodlar. |
LoadString(UserStringHandle) |
Yönergeyi ve işlenenini kodlar |
MarkLabel(LabelHandle) |
Belirtilen etiketi geçerli IL uzaklığıyla ilişkilendirir. |
OpCode(ILOpCode) |
Belirtilen op-code kodunu kodlar. |
StoreArgument(Int32) |
Bağımsız değişken deposu yönergesi kodlar. |
StoreLocal(Int32) |
Yerel değişken deposu yönergesi kodlar. |
Switch(Int32) |
Anahtar yönergesi kodlamayı başlatır. |
Token(EntityHandle) |
Bir belirteci kodlar. |
Token(Int32) |
Bir belirteci kodlar. |