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 Вызывает метод, на который указывает, с аргументами, описанными в соглашении о вызовах.

Переходный режим стека в последовательном порядке:

  1. Аргументы arg1 методов передаются argN в стек.

  2. Указатель входа метода помещается в стек.

  3. Аргументы arg1 метода и argN указатель входа метода выскочат из стека; выполняется вызов метода . По завершении вызываемого метода создается возвращаемое значение и отправляется вызывающей объекту.

  4. Возвращаемое значение передается в стек.

Инструкция calli вызывает указатель входа метода с аргументами arg1 через argN. Типы этих аргументов описываются определенным соглашением о вызовах (callSiteDesc). Инструкции calli может предшествовать tail префикс (Tailcall), чтобы указать, что текущее состояние метода должно быть освобождено перед передачей управления. Если вызов передаст управление методу с более высоким уровнем доверия, чем методу источника, кадр стека не будет освобожден; Вместо этого выполнение будет продолжаться молча, как если бы tail не было предоставлено .

Предполагается, что указатель входа метода является определенным указателем на машинный код (целевого компьютера), который можно вызывать с помощью аргументов, описанных в соглашении о вызове (маркер метаданных для автономной подписи). Такой указатель можно создать с помощью инструкций Ldftn или Ldvirtftn или передать из машинного кода.

Соглашение о вызовах не проверяется динамически, поэтому код, использующий инструкцию calli , не работает правильно, если назначение фактически не использует указанное соглашение о вызовах.

Аргументы помещаются в стек в порядке слева направо. То есть первый аргумент вычисляется и помещается в стек, затем второй аргумент, затем третий, пока все необходимые аргументы не будут помещены на вершину стека в порядке убывания. Последовательность кода для создания аргументов для экземпляра или виртуального метода должна отправлять ссылку на экземпляр (которая не должна быть пустой ссылкой) перед любым из видимых пользователем аргументов.

SecurityException Может возникать, если система безопасности не предоставляет вызывающему объекту доступ к вызываемого метода. Проверка безопасности может возникнуть при преобразовании инструкций MSIL в машинный код, а не во время выполнения.

Для выполнения инструкций calli в стеке можно использовать следующие EmitCalli методы. Обратите внимание, что calli метод должен вызываться с помощью приведенных ниже методов, а не с помощью Emit класса для размещения инструкции непосредственно в стеке.

Применяется к