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
Значение поля
Комментарии
В следующей таблице перечислены шестнадцатеричные и шестнадцатеричные и Microsoft формат сборки промежуточного языка (MSIL) инструкции, а также краткая сводка по ссылке:
| Format | Формат сборки | Description |
|---|---|---|
6F <T> |
callvirt method |
Вызывает определенный метод, связанный с obj. |
Переходное поведение стека в последовательном порядке:
Ссылка на
objобъект отправляется в стек.Аргументы
arg1argNметода передаются в стек.Аргументы
arg1argNметода через и ссылкаobjна объект передаются из стека; вызов метода выполняется с этими аргументами и элементом управления передается методу,objкоторый ссылается на маркер метаданных метода. По завершении возвращаемое значение создается методом вызываемого абонента и отправляется вызывающей объекту.Возвращаемое значение передается в стек.
Инструкция callvirt вызывает метод с поздней привязкой к объекту. То есть метод выбирается на основе типа obj среды выполнения, а не класса времени компиляции, видимого в указателе метода.
Callvirt можно использовать для вызова методов виртуальных и экземпляров. Перед callvirt передачей элемента управления инструкция может быть немедленно предшествует префиксу tail (Tailcall) для указания того, что текущий кадр стека должен быть выпущен перед передачей элемента управления. Если вызов передаст управление методу более высокого доверия, чем исходный метод, кадр стека не будет выпущен.
Маркер метаданных метода предоставляет имя, класс и подпись вызываемого метода. Класс, связанный с obj этим, является классом, с которым он является экземпляром. Если класс определяет нестатический метод, соответствующий указанному имени метода и сигнатуре, вызывается этот метод. В противном случае все классы в цепочке базовых классов этого класса проверяются в порядке. Это ошибка, если метод не найден.
Callvirt выводит объект и связанные аргументы из стека оценки перед вызовом метода. Если метод имеет возвращаемое значение, он отправляется в стек после завершения метода. На стороне obj вызываемого абонента параметр обращается как аргумент 0, arg1 как аргумент 1 и т. д.
Аргументы помещаются в стек слева направо. То есть первый аргумент вычисляется и помещается в стек, а затем второй аргумент, а затем третий, пока все необходимые аргументы не находятся в стеке в порядке убывания. Ссылка на obj экземпляр (всегда необходимая для callvirt) должна быть отправлена перед любым из видимых пользователем аргументов. Подпись (переносимая маркером метаданных) не должна содержать запись в списке параметров для этого указателя.
Обратите внимание, что виртуальный метод также можно вызвать с помощью инструкции Call .
MissingMethodException вызывается, если нестатический метод с указанным именем и подписью не удалось найти в классе, связанном с obj или любым из его базовых классов. Обычно это обнаруживается при преобразовании инструкций Microsoft промежуточного языка (MSIL) в машинный код, а не во время выполнения.
NullReferenceException вызывается, если obj имеет значение NULL.
SecurityException возникает, если системная безопасность не предоставляет вызывающему методу доступ. Проверка безопасности может возникать при преобразовании CIL в машинный код, а не во время выполнения.
Note
При вызове методов System.Object в типах значений рекомендуется использовать constrained префикс с инструкцией callvirt . Это удаляет необходимость выдавать разные il в зависимости от того, переопределяет ли тип значения метод, избегая потенциальной проблемы управления версиями. Рекомендуется использовать constrained префикс при вызове методов интерфейса для типов значений, так как метод типа значения, реализующий метод интерфейса, можно изменить с помощью метода MethodImpl. Эти проблемы подробно описаны в опкоде Constrained .
Следующая Emit перегрузка метода может использовать callvirt код opcode: