OpCodes.Calli 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 en la pila de evaluación (como puntero a un punto de entrada) con los argumentos descritos mediante una convención de llamada.
public: static initonly System::Reflection::Emit::OpCode Calli;
public static readonly System.Reflection.Emit.OpCode Calli;
staticval mutable Calli : System.Reflection.Emit.OpCode
Public Shared ReadOnly Calli 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 |
---|---|---|
29 <T > |
Calli callSiteDescr |
Llama al método al que apunta con los argumentos descritos por la convención de llamada. |
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.El puntero de entrada del método se inserta en la pila.
Los argumentos
arg1
del método a travésargN
de y el puntero de entrada del método se extraen de la pila; se realiza la llamada al 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 calli
instrucción llama al puntero de entrada del método con los argumentos arg1
a través argN
de . Los tipos de estos argumentos se describen mediante la convención de llamada específica (callSiteDesc
). La calli
instrucción puede ir precedida inmediatamente por un tail
prefijo (Tailcall) para especificar que el estado del método 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 de origen, no se liberará el marco de pila; en su lugar, la ejecución continuará silenciosamente como si tail
no se hubiera proporcionado.
Se supone que el puntero de entrada del método es un puntero específico al código nativo (de la máquina de destino) que se puede llamar legítimamente con los argumentos descritos por la convención de llamada (un token de metadatos para una firma independiente). Este puntero se puede crear mediante las Ldftn instrucciones o Ldvirtftn , o pasar desde código nativo.
La convención de llamada no se comprueba dinámicamente, por lo que el código que usa una calli
instrucción no funciona correctamente si el destino no usa realmente la convención de llamada especificada.
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 secuencia de código de creación de argumentos para una instancia o un método virtual debe insertar esa referencia de instancia (que no debe ser una referencia nula) antes de ninguno de los argumentos visibles para el usuario.
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.
Los métodos siguientes EmitCalli se pueden usar para realizar una calli
instrucción en la pila. Tenga en cuenta que calli
se debe llamar a través de los métodos siguientes en lugar de usar la Emit clase para colocar la instrucción directamente en la pila.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) para llamadas mediante una convención de llamada administrada.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) para las llamadas que usan una convención de llamada no administrada.