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 . |
Переходный режим стека в последовательном порядке:
Ссылка на
obj
объект передается в стек.Аргументы
arg1
метода передаютсяargN
в стек.Аргументы
arg1
метода черезargN
и ссылка наobj
объект извлекаются из стека; вызов метода выполняется с этими аргументами, а управление передается методу вobj
, на который ссылается маркер метаданных метода. По завершении вызываемого метода создается возвращаемое значение и отправляется вызывающей объекту.Возвращаемое значение передается в стек.
Инструкция 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
метода может использовать код операции: