OpCodes.Call Поле

Определение

Вызывает метод, указанный дескриптором переданного метода.

public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
 staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call As OpCode 

Значение поля

Комментарии

В следующей таблице перечислены шестнадцатеричные и шестнадцатеричные и Microsoft формат сборки промежуточного языка (MSIL) инструкции, а также краткая сводка по ссылке:

Формат Формат сборки Description
28 <T> Вызова methodDesc Вызов метода, описанного methodDescв .

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

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

  2. Аргументы arg1argN метода передаются из стека. Вызов метода выполняется с этими аргументами и элементом управления передается методу, на который ссылается дескриптор метода. По завершении возвращаемое значение создается методом вызываемого абонента и отправляется вызывающей объекту.

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

Инструкция call вызывает метод, указанный дескриптором метода, переданным инструкцией. Дескриптор метода — это маркер метаданных, указывающий метод для вызова и номера, типа и порядка аргументов, которые были помещены в стек, передаваемые в этот метод, а также используемое соглашение о вызовах. Перед call передачей элемента управления можно сразу же предшествуть tail инструкции префикса (Tailcall) для указания того, что текущее состояние метода должно быть выпущено перед передачей элемента управления. Если вызов передает управление методу более высокого доверия, чем метод источника, кадр стека не освобождается. Вместо этого выполнение продолжается молча, как если бы tail не было предоставлено. Маркер метаданных содержит достаточную информацию, чтобы определить, является ли вызов статическим методом, методом экземпляра, виртуальным методом или глобальной функцией. Во всех этих случаях целевой адрес полностью определяется дескриптором метода (в отличие Callvirt от инструкции по вызову виртуальных методов, где целевой адрес также зависит от типа среды выполнения ссылки экземпляра, отправленной до этого Callvirt).

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

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

  2. Допустимо вызывать виртуальный метод с помощью call (а не callvirt); это означает, что метод должен быть разрешен с помощью класса, указанного методом, а не как указано динамически из вызываемого объекта.

  3. Обратите внимание, что метод делегата Invoke можно вызвать с помощью инструкции call или callvirt инструкции.

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

Note

При вызове методов System.Object в типах значений рекомендуется использовать constrained префикс с callvirt инструкцией вместо создания инструкции call . Это удаляет необходимость выдавать разные il в зависимости от того, переопределяет ли тип значения метод, избегая потенциальной проблемы управления версиями. Рекомендуется использовать constrained префикс при вызове методов интерфейса для типов значений, так как метод типа значения, реализующий метод интерфейса, можно изменить с помощью метода MethodImpl. Эти проблемы подробно описаны в опкоде Constrained .

Следующие Emit перегрузки методов могут использовать call код opcode:

Note

Метод EmitCall предоставляется для varargs вызовов. Emit Используйте метод для обычных вызовов.

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