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