InstructionEncoder Структура
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Кодирует инструкции по общему промежуточному языку (CIL).
public value class InstructionEncoder
public readonly struct InstructionEncoder
public struct InstructionEncoder
type InstructionEncoder = struct
Public Structure InstructionEncoder
- Наследование
Примеры
В этом примере показано, как вывести текст метода с помощью 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;
}
Комментарии
Класс InstructionEncoder используется для выдачи инструкций CIL, составляющих текст метода. Полный пример создания метода см. в документации по классам MetadataBuilder .
Конструкторы
| Имя | Описание |
|---|---|
| InstructionEncoder(BlobBuilder, ControlFlowBuilder) |
Создает кодировщик, поддерживаемый построителями кода и потока управления. |
Свойства
| Имя | Описание |
|---|---|
| CodeBuilder |
Базовый построитель, в котором записываются закодированные инструкции. |
| ControlFlowBuilder |
Метки отслеживания построителя, ветви и обработчики исключений. |
| Offset |
Смещение следующей закодированной инструкции. |
Методы
| Имя | Описание |
|---|---|
| Branch(ILOpCode, LabelHandle) |
Кодирует инструкцию ветви. |
| Call(EntityHandle) |
Кодирует |
| Call(MemberReferenceHandle) |
Кодирует |
| Call(MethodDefinitionHandle) |
Кодирует |
| Call(MethodSpecificationHandle) |
Кодирует |
| CallIndirect(StandaloneSignatureHandle) |
Кодирует |
| DefineLabel() |
Определяет метку, которую можно использовать для пометки и ссылки на расположение в потоке инструкций. |
| LoadArgument(Int32) |
Кодирует инструкцию загрузки аргументов. |
| LoadArgumentAddress(Int32) |
Кодирует инструкцию по загрузке адреса аргумента. |
| LoadConstantI4(Int32) |
Кодирует Int32 инструкцию постоянной загрузки. |
| LoadConstantI8(Int64) |
Кодирует Int64 инструкцию постоянной загрузки. |
| LoadConstantR4(Single) |
Кодирует Single инструкцию постоянной загрузки. |
| LoadConstantR8(Double) |
Кодирует Double инструкцию постоянной загрузки. |
| LoadLocal(Int32) |
Кодирует инструкцию загрузки локальной переменной. |
| LoadLocalAddress(Int32) |
Кодирует инструкцию загрузки адресов локальной переменной. |
| LoadString(UserStringHandle) |
Кодирует |
| MarkLabel(LabelHandle) |
Связывает указанную метку с текущим смещением IL. |
| OpCode(ILOpCode) |
Кодирует указанный op-code. |
| StoreArgument(Int32) |
Кодирует инструкцию хранилища аргументов. |
| StoreLocal(Int32) |
Кодирует инструкцию хранилища локальных переменных. |
| Switch(Int32) |
Начинает кодирование инструкции коммутатора. |
| Token(EntityHandle) |
Кодирует маркер. |
| Token(Int32) |
Кодирует маркер. |