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[]) для вызовов, использующих соглашение о неуправляемых вызовах.
Применяется к
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по