Поделиться через


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 

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

Комментарии

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

Примечание

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

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