OpCodes.Calli Поле
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Вызывает метод, указанный в стеке оценки (в качестве указателя на точку входа) с аргументами, описанными в соглашении о вызове.
public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli As OpCode
Значение поля
Комментарии
В следующей таблице перечислены шестнадцатеричные и шестнадцатеричные и Microsoft формат сборки промежуточного языка (MSIL) инструкции, а также краткая сводка по ссылке:
| Формат | Формат сборки | Description |
|---|---|---|
29 <T> |
Calli callSiteDescr |
Вызывает метод, указывающий на аргументы, описанные в соглашении о вызовах. |
Переходное поведение стека в последовательном порядке:
Аргументы
arg1argNметода передаются в стек.Указатель входа метода передается в стек.
Аргументы
arg1argNметода с помощью указателя входа метода отображаются из стека; выполняется вызов метода. По завершении возвращаемое значение создается методом вызываемого абонента и отправляется вызывающей объекту.Возвращаемое значение передается в стек.
Инструкция calli вызывает указатель входа метода с аргументамиarg1.argN Типы этих аргументов описываются определенным соглашением о вызовах (callSiteDesc). Перед calli передачей элемента управления инструкция может быть немедленно tail предшествует префиксу (Tailcall), чтобы указать, что текущее состояние метода должно быть выпущено перед передачей элемента управления. Если вызов передаст управление методом более высокого доверия, чем метод источника, кадр стека не будет освобожден; Вместо этого выполнение будет продолжаться молча, как если бы tail не было предоставлено.
Предполагается, что указатель входа метода является конкретным указателем на машинный код (целевого компьютера), который можно законно вызывать с аргументами, описанными в соглашении о вызове (маркер метаданных для автономной подписи). Такой указатель можно создать с помощью Ldftn инструкций или Ldvirtftn инструкций или передать из машинного кода.
Соглашение о вызове не проверяется динамически, поэтому код, использующий calli инструкцию, не работает правильно, если назначение фактически не использует указанное соглашение о вызовах.
Аргументы помещаются в стек слева направо. То есть первый аргумент вычисляется и помещается в стек, а затем второй аргумент, а затем третий, пока все необходимые аргументы не находятся в стеке в порядке убывания. Последовательность кода сборки аргументов для экземпляра или виртуального метода должна отправлять ссылку на этот экземпляр (который не должен быть пустой ссылкой) перед любым из видимых пользователем аргументов.
SecurityException может возникать, если системная безопасность не предоставляет вызывающему методу доступ. Проверка безопасности может возникать, когда инструкции Microsoft промежуточного языка (MSIL) преобразуются в машинный код, а не во время выполнения.
Для выполнения инструкций EmitCalli в стеке можно использовать следующие calli методы. Обратите внимание, что calli следует вызывать с помощью приведенных ниже методов, а не использовать Emit класс для размещения инструкции непосредственно в стеке.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) для вызовов с помощью соглашения об управляемых вызовах.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) для вызовов с помощью неуправляемого соглашения о вызовах.