Expandir Minimizar
Este tema aún no ha recibido ninguna valoración - Valorar este tema

OpCodes.Callvirt (Campo)

Llama a un método enlazado tardíamente en un objeto e inserta el valor devuelto en la pila de evaluación.

Espacio de nombres: System.Reflection.Emit
Ensamblado: mscorlib (en mscorlib.dll)

public static readonly OpCode Callvirt
public static final OpCode Callvirt
public static final var Callvirt : OpCode

En la tabla siguiente, se muestra el ensamblado de la instrucción máquina en formato hexadecimal y en formato de Lenguaje intermedio de Microsoft (MSIL), junto con un breve resumen de referencia:

Formato

Formato del ensamblado

Descripción

6F < T >

callvirt method

Llama a un método específico asociado a obj.

El comportamiento transicional de la pila es, por orden secuencial:

  1. Una referencia a objeto obj se inserta en la pila.

  2. Los argumentos de método comprendidos entre arg1 y argN se insertan en la pila.

  3. Los argumentos de método comprendidos entre arg1 y argN y la referencia al objeto obj se extraen de la pila; la llamada al método se realiza con estos argumentos y el control se transfiere al método en el parámetro obj al que hace referencia el símbolo (token) de metadatos del método. Finalizado este proceso, el método que recibe la llamada genera un valor que se devuelve al llamador.

  4. El valor devuelto se inserta en la pila.

La instrucción máquina callvirt llama a un método enlazado tardíamente en un objeto. Es decir, el método se elige en función del tipo de obj en tiempo de ejecución en lugar de la clase en tiempo de compilación que es visible en el puntero del método. Callvirt se puede utilizar para llamar a métodos virtuales y de instancia. La instrucción máquina callvirt puede ir inmediatamente precedida de un prefijo tail (Tailcall) para especificar que el marco de pila 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, no se libera el marco de pila.

El símbolo (token) de metadatos del método proporciona el nombre, la clase y la firma del método al que se llama. La clase asociada a obj es la clase de la que éste 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, se comprueban por orden todas las clases de la cadena de clases base de esta clase. Si no se encuentra ningún método, se produce un error.

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 una vez completado el método. En la parte del destinatario de la llamada, se obtiene acceso al parámetro obj como argumento 0, arg1 como argumento 1, y así sucesivamente.

Los argumentos se colocan en la pila de izquierda a derecha. Es decir, se calcula y se coloca en la pila el primer argumento, después el segundo argumento, luego el tercero, hasta que todos los argumentos necesarios se encuentren en la parte superior de la pila por orden descendente. La referencia a instancia obj (siempre obligatoria para callvirt) debe insertarse delante de cualquier argumento que sea visible para el usuario. No es necesario que la firma (incluida en el símbolo (token) de metadatos) contenga una entrada en la lista de parámetros para este puntero.

Tenga en cuenta que también se puede llamar al método virtual mediante la instrucción máquina Call.

Se produce MissingMethodException si no se puede encontrar un método no estático con el nombre y la firma indicados en la clase asociada a obj o alguna de sus clases base. Normalmente, esto se detecta cuando las instrucciones del Lenguaje intermedio de Microsoft (MSIL) se convierten en código nativo, en lugar de detectarse en tiempo de ejecución.

Si obj es null, se produce NullReferenceException.

Si la seguridad del sistema no concede al llamador acceso al método llamado, se produce SecurityException. La comprobación de seguridad puede producirse cuando CIL se convierte en código nativo, en lugar de producirse en tiempo de ejecución.

NotaNota

Al llamar a los métodos de System.Object en tipos de valor, considere la posibilidad de utilizar el prefijo constrained con la instrucción callvirt. Esto elimina la necesidad de emitir un lenguaje intermedio diferente que depende de si el tipo de valor reemplaza o no el método, y evita un problema potencial de versiones. Considere la posibilidad de utilizar el prefijo constrained al invocar los 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 de forma más detallada en el código de operación Constrained.

La siguiente sobrecarga del método Emit puede utilizar el código de operación callvirt:

  • ILGenerator.Emit(OpCode, MethodInfo)

  • ILGenerator.EmitCall(OpCode, MethodInfo, Type[])

Windows 98, Windows 2000 SP4, Windows Millennium, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0
¿Te ha resultado útil?
(Caracteres restantes: 1500)

Adiciones de comunidad

AGREGAR
© 2013 Microsoft. Reservados todos los derechos.