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


OpCodes.Callvirt Поле

Определение

Вызывает метод объекта с поздней привязкой и помещает возвращаемое значение в стек вычислений.

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

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

Комментарии

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

Формат Формат сборки Описание
6F <T> callvirt method Вызывает определенный метод, связанный с obj.

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

  1. Ссылка на obj объект передается в стек.

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

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

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

Инструкция callvirt вызывает метод с поздней привязкой для объекта . То есть метод выбирается на основе типа среды выполнения , obj а не класса времени компиляции, видимого в указателе метода. Callvirt можно использовать для вызова виртуальных методов и методов экземпляра. Инструкции callvirt может предшествовать tail префикс (Tailcall), чтобы указать, что текущий кадр стека должен быть освобожден перед передачей управления. Если вызов передаст управление методу с более высоким уровнем доверия, чем исходный метод, кадр стека не будет освобожден.

Маркер метаданных метода предоставляет имя, класс и сигнатуру вызываемого метода. Класс, связанный с obj , является классом, экземпляром которого он является. Если класс определяет нестатический метод, соответствующий указанному имени и сигнатуре метода, вызывается этот метод. В противном случае все классы в цепочке базовых классов этого класса проверяются по порядку. Если метод не найден, это ошибка.

Callvirt извлекает объект и связанные аргументы из стека вычислений перед вызовом метода . Если метод имеет возвращаемое значение, он отправляется в стек после завершения метода. На вызываемой стороне доступ к параметру obj осуществляется как аргумент 0, arg1 как аргумент 1 и т. д.

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

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

MissingMethodException Возникает, если нестатический метод с указанным именем и сигнатурой не найден в классе, связанном с obj или любым из его базовых классов. Обычно это обнаруживается при преобразовании инструкций msil в машинный код, а не во время выполнения.

NullReferenceException возникает, если obj имеет значение NULL.

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

Примечание

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

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

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