InstructionEncoder Struktur
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengodekan instruksi Common Intermediate Language (CIL).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Warisan
Contoh
Contoh ini menunjukkan cara memancarkan isi metode menggunakan 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;
}
Keterangan
Kelas InstructionEncoder ini digunakan untuk memancarkan instruksi CIL yang membentuk isi metode. Untuk contoh lengkap memancarkan metode, lihat MetadataBuilder dokumentasi kelas.
Konstruktor
InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Membuat encoder yang didukung oleh penyusun kode dan aliran kontrol. |
Properti
CodeBuilder |
Penyusun yang mendasar tempat instruksi yang dikodekan ditulis. |
ControlFlowBuilder |
Label pelacakan penyusun, cabang, dan penangan pengecualian. |
Offset |
Offset dari instruksi yang dikodekan berikutnya. |
Metode
Branch(ILOpCode, LabelHandle) |
Mengodekan instruksi cabang. |
Call(EntityHandle) |
Mengodekan |
Call(MemberReferenceHandle) |
Mengodekan |
Call(MethodDefinitionHandle) |
Mengodekan |
Call(MethodSpecificationHandle) |
Mengodekan |
CallIndirect(StandaloneSignatureHandle) |
Mengodekan |
DefineLabel() |
Menentukan label yang nantinya dapat digunakan untuk menandai dan merujuk ke lokasi di aliran instruksi. |
LoadArgument(Int32) |
Mengodekan instruksi beban argumen. |
LoadArgumentAddress(Int32) |
Mengodekan instruksi beban alamat argumen. |
LoadConstantI4(Int32) |
Mengodekan Int32 instruksi beban konstan. |
LoadConstantI8(Int64) |
Mengodekan Int64 instruksi beban konstan. |
LoadConstantR4(Single) |
Mengodekan Single instruksi beban konstan. |
LoadConstantR8(Double) |
Mengodekan Double instruksi beban konstan. |
LoadLocal(Int32) |
Mengodekan instruksi beban variabel lokal. |
LoadLocalAddress(Int32) |
Mengodekan instruksi beban alamat variabel lokal. |
LoadString(UserStringHandle) |
Mengodekan |
MarkLabel(LabelHandle) |
Mengaitkan label yang ditentukan dengan offset IL saat ini. |
OpCode(ILOpCode) |
Mengodekan op-code yang ditentukan. |
StoreArgument(Int32) |
Mengodekan instruksi penyimpanan argumen. |
StoreLocal(Int32) |
Mengodekan instruksi penyimpanan variabel lokal. |
Switch(Int32) |
Mulai mengodekan instruksi switch. |
Token(EntityHandle) |
Mengodekan token. |
Token(Int32) |
Mengodekan token. |