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
Значение поля
Комментарии
В следующей таблице приведен шестнадцатеричный формат инструкции и формат сборки MSIL, а также краткая справочная сводка:
Формат | Формат сборки | Описание |
---|---|---|
29 <T > |
Calli callSiteDescr |
Вызывает метод, на который указывает, с аргументами, описанными в соглашении о вызовах. |
Переходный режим стека в последовательном порядке:
Аргументы
arg1
методов передаютсяargN
в стек.Указатель входа метода помещается в стек.
Аргументы
arg1
метода иargN
указатель входа метода выскочат из стека; выполняется вызов метода . По завершении вызываемого метода создается возвращаемое значение и отправляется вызывающей объекту.Возвращаемое значение передается в стек.
Инструкция calli
вызывает указатель входа метода с аргументами arg1
через argN
. Типы этих аргументов описываются определенным соглашением о вызовах (callSiteDesc
). Инструкции calli
может предшествовать tail
префикс (Tailcall), чтобы указать, что текущее состояние метода должно быть освобождено перед передачей управления. Если вызов передаст управление методу с более высоким уровнем доверия, чем методу источника, кадр стека не будет освобожден; Вместо этого выполнение будет продолжаться молча, как если бы tail
не было предоставлено .
Предполагается, что указатель входа метода является определенным указателем на машинный код (целевого компьютера), который можно вызывать с помощью аргументов, описанных в соглашении о вызове (маркер метаданных для автономной подписи). Такой указатель можно создать с помощью инструкций Ldftn или Ldvirtftn или передать из машинного кода.
Соглашение о вызовах не проверяется динамически, поэтому код, использующий инструкцию calli
, не работает правильно, если назначение фактически не использует указанное соглашение о вызовах.
Аргументы помещаются в стек в порядке слева направо. То есть первый аргумент вычисляется и помещается в стек, затем второй аргумент, затем третий, пока все необходимые аргументы не будут помещены на вершину стека в порядке убывания. Последовательность кода для создания аргументов для экземпляра или виртуального метода должна отправлять ссылку на экземпляр (которая не должна быть пустой ссылкой) перед любым из видимых пользователем аргументов.
SecurityException Может возникать, если система безопасности не предоставляет вызывающему объекту доступ к вызываемого метода. Проверка безопасности может возникнуть при преобразовании инструкций MSIL в машинный код, а не во время выполнения.
Для выполнения инструкций calli
в стеке можно использовать следующие EmitCalli методы. Обратите внимание, что calli
метод должен вызываться с помощью приведенных ниже методов, а не с помощью Emit класса для размещения инструкции непосредственно в стеке.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) для вызовов, использующих соглашение об управляемых вызовах.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) для вызовов, использующих соглашение о неуправляемых вызовах.