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 класса для размещения инструкции непосредственно в стеке.

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