OpCodes.Call Campo
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Llama al método indicado por el descriptor del método que se ha pasado.
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
Valor de campo
Comentarios
En la tabla siguiente se muestra el formato de ensamblado hexadecimal y lenguaje intermedio de Microsoft (MSIL), junto con un breve resumen de referencia:
Formato | Formato de ensamblado | Descripción |
---|---|---|
28 <T > |
call methodDesc (llamar al 555-555-5555) |
Llame al método descrito por methodDesc . |
El comportamiento de transición de pila, en orden secuencial, es:
Los argumentos
arg1
del método a travésargN
se insertan en la pila.Los argumentos
arg1
del método a travésargN
se extraen de la pila; la llamada al método se realiza con estos argumentos y el control se transfiere al método al que hace referencia el descriptor de método. Cuando se completa, el método de llamada genera un valor devuelto y se envía al autor de la llamada.El valor devuelto se inserta en la pila.
La call
instrucción llama al método indicado por el descriptor de método pasado con la instrucción . El descriptor de método es un token de metadatos que indica el método al que llamar y el número, el tipo y el orden de los argumentos que se han colocado en la pila que se van a pasar a ese método, así como a la convención de llamada que se va a usar. La call
instrucción puede ir precedida inmediatamente por una tail
instrucción de prefijo (Tailcall) para especificar que el estado del método actual debe liberarse antes de transferir el control. Si la llamada transfiere el control a un método de mayor confianza que el método de origen, el marco de pila no se libera. En su lugar, la ejecución continúa silenciosamente como si tail
no se hubiera proporcionado . El token de metadatos contiene información suficiente para determinar si la llamada es a un método estático, a un método de instancia, a un método virtual o a una función global. En todos estos casos, la dirección de destino se determina completamente desde el descriptor del método (contrasta esto con la Callvirt instrucción para llamar a métodos virtuales, donde la dirección de destino también depende del tipo de tiempo de ejecución de la referencia de instancia insertada antes de Callvirt).
Los argumentos se colocan en la pila en orden de izquierda a derecha. Es decir, el primer argumento se calcula y coloca en la pila, después el segundo argumento y, a continuación, el tercero, hasta que todos los argumentos necesarios están encima de la pila en orden descendente. Hay tres casos especiales importantes:
Las llamadas a un método de instancia (o virtual) deben insertar esa referencia de instancia antes de cualquiera de los argumentos visibles para el usuario. La referencia de instancia no debe ser una referencia nula. La firma que se lleva en los metadatos no contiene una entrada en la lista de parámetros para el
this
puntero; en su lugar, usa un bit para indicar si el método requiere pasar elthis
puntero.Es válido llamar a un método virtual mediante
call
(en lugar decallvirt
); esto indica que el método se va a resolver mediante la clase especificada por método en lugar de como se especifica dinámicamente desde el objeto que se invoca.Tenga en cuenta que se puede llamar al método de
Invoke
un delegado con lacall
instrucción ocallvirt
.
SecurityException se puede producir si la seguridad del sistema no concede al autor de la llamada acceso al método llamado. La comprobación de seguridad puede producirse cuando las instrucciones del lenguaje intermedio de Microsoft (MSIL) se convierten en código nativo en lugar de en tiempo de ejecución.
Nota
Al llamar a métodos de System.Object en tipos de valor, considere la posibilidad de usar el constrained
prefijo con la callvirt
instrucción en lugar de emitir una call
instrucción. Esto quita la necesidad de emitir un IL diferente en función de si el tipo de valor invalida o no el método, evitando un posible problema de control de versiones. Considere la posibilidad de usar el constrained
prefijo al invocar métodos de interfaz en tipos de valor, ya que el método de tipo de valor que implementa el método de interfaz se puede cambiar mediante .MethodImpl
Estos problemas se describen con más detalle en el Constrained código de operación.
Las sobrecargas de método siguientes Emit pueden usar el call
código de operación:
Nota
El EmitCall método se proporciona para varargs
las llamadas. Use el Emit método para las llamadas normales.