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 . |
Переходный режим стека в последовательном порядке:
Аргументы
arg1
метода передаютсяargN
в стек.Аргументы
arg1
метода черезargN
извлекаются из стека; вызов метода выполняется с этими аргументами, а управление передается методу, на который ссылается дескриптор метода. По завершении вызываемого метода создается возвращаемое значение и отправляется вызывающей объекту.Возвращаемое значение передается в стек.
Инструкция call
вызывает метод, указанный дескриптором метода, переданным вместе с инструкцией . Дескриптор метода — это маркер метаданных, указывающий вызываемый метод, а также номер, тип и порядок аргументов, которые были помещены в стек для передаче в этот метод, а также используемое соглашение о вызовах. Инструкции call
может предшествовать tail
инструкция с префиксом (Tailcall), чтобы указать, что текущее состояние метода должно быть освобождено перед передачей управления. Если вызов передает управление методу с более высоким уровнем доверия, чем метод-источник, кадр стека не освобождается. Вместо этого выполнение продолжается безмолвно, как если бы tail
не было предоставлено. Маркер метаданных содержит достаточные сведения, чтобы определить, является ли вызов статическим методом, методом экземпляра, виртуальным методом или глобальной функцией. Во всех этих случаях адрес назначения определяется полностью из дескриптора метода (сравните это с Callvirt инструкцией по вызову виртуальных методов, где адрес назначения также зависит от типа среды выполнения ссылки на экземпляр, отправленной перед Callvirt).
Аргументы помещаются в стек в порядке слева направо. То есть первый аргумент вычисляется и помещается в стек, затем второй аргумент, затем третий, пока все необходимые аргументы не будут помещены в стек в порядке убывания. Существует три важных особых случая:
Вызовы метода экземпляра (или виртуального) должны отправлять ссылку на экземпляр перед любым из видимых пользователем аргументов. Ссылка на экземпляр не должна быть пустой ссылкой. Сигнатура, переносимая в метаданных, не содержит запись в списке параметров для
this
указателя. Вместо этого она использует бит, чтобы указать, требуется ли методу передатьthis
указатель.Допустимо вызывать виртуальный метод с помощью
call
(а неcallvirt
); это означает, что метод должен быть разрешен с помощью класса, указанного методом , а не как указано динамически из вызываемого объекта.Обратите внимание, что метод делегата
Invoke
можно вызвать с помощью инструкцииcall
илиcallvirt
.
SecurityException Может возникать, если системная безопасность не предоставляет вызывающему объекту доступ к вызываемого метода. Проверка безопасности может возникать, когда инструкции msil преобразуются в машинный код, а не во время выполнения.
Примечание
При вызове методов System.Object для типов значений constrained
рекомендуется использовать префикс с callvirt
инструкцией вместо создания call
инструкции. Это устраняет необходимость выдавать разные il-коды в зависимости от того, переопределяет ли тип значения метод, что позволяет избежать потенциальных проблем с управлением версиями. Рекомендуется использовать constrained
префикс при вызове методов интерфейса для типов значений MethodImpl
, так как метод типа значения, реализующий метод интерфейса, можно изменить с помощью . Эти проблемы более подробно описаны в коде Constrained операции.
Emit Следующие перегрузки методов могут использовать call
код операции:
Примечание
Метод EmitCall предоставляется для varargs
вызовов.
Emit Используйте метод для обычных вызовов.