OpCodes.Callvirt 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 a un método enlazado tardíamente en un objeto e inserta el valor devuelto en la pila de evaluación.
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
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 |
---|---|---|
6F <T > |
callvirt method |
Llama a un método específico asociado a obj . |
El comportamiento de transición de pila, en orden secuencial, es:
Una referencia
obj
de objeto se inserta en la pila.Los argumentos
arg1
del método a travésargN
se insertan en la pila.Los argumentos
arg1
de método a travésargN
de y la referenciaobj
de objeto se extraen de la pila; la llamada al método se realiza con estos argumentos y el control se transfiere al método alobj
que hace referencia el token de metadatos del 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 callvirt
instrucción llama a un método enlazado en tiempo de ejecución en un objeto . Es decir, el método se elige en función del tipo en tiempo de ejecución de en lugar de obj
la clase en tiempo de compilación visible en el puntero del método.
Callvirt
se puede usar para llamar a métodos virtuales e de instancia. La callvirt
instrucción puede ir precedida inmediatamente por un tail
prefijo (Tailcall) para especificar que el marco de pila actual debe liberarse antes de transferir el control. Si la llamada transferiría el control a un método de mayor confianza que el método original, el marco de pila no se liberará.
El token de metadatos del método proporciona el nombre, la clase y la firma del método al que se va a llamar. La clase asociada a obj
es la clase de la que es una instancia. Si la clase define un método no estático que coincide con el nombre y la firma del método indicados, se llama a este método. De lo contrario, todas las clases de la cadena de clases base de esta clase se comprueban en orden. Es un error si no se encuentra ningún método.
Callvirt
extrae el objeto y los argumentos asociados de la pila de evaluación antes de llamar al método . Si el método tiene un valor devuelto, se inserta en la pila tras la finalización del método. En el lado de la llamada, obj
se tiene acceso al parámetro como argumento 0, arg1
como argumento 1, etc.
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. La referencia obj
de instancia (siempre necesaria para callvirt
) debe insertarse antes de cualquiera de los argumentos visibles para el usuario. La firma (transportada en el token de metadatos) no debe contener una entrada en la lista de parámetros para el puntero this.
Tenga en cuenta que también se puede llamar a un método virtual mediante la Call instrucción .
MissingMethodException se produce si no se encontró un método no estático con el nombre indicado y la firma en la clase asociada obj
a o a ninguna de sus clases base. Esto suele detectarse cuando las instrucciones del lenguaje intermedio de Microsoft (MSIL) se convierten en código nativo, en lugar de en tiempo de ejecución.
NullReferenceException se produce si obj es null.
SecurityException se produce 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 la CIL se convierte 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 . 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.
La sobrecarga del método siguiente Emit puede usar el callvirt
código de operación: