OpCodes.Calli Campo
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Chama o método indicado na pilha de avaliação (como apontador para um ponto de entrada) com argumentos descritos por uma convenção de chamada.
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
Observações
A tabela seguinte lista o formato hexadecimal e assembly da Microsoft Intermediate Language (MSIL) da instrução, juntamente com um breve resumo de referência:
| Formato | Formato de Montagem | Descrição |
|---|---|---|
29 <T> |
Calli callSiteDescr |
Chama o método a que se aponta com argumentos descritos pela convenção de chamada. |
O comportamento de transição da pilha, por ordem sequencial, é:
Os argumentos
arg1do método atravésargNsão empurrados para a pilha.O ponteiro de entrada do método é empurrado para a pilha.
Os argumentos
arg1do método atravésargNe o apontador de entrada do método são extraídos da pilha; a chamada ao método é realizada. Quando concluído, um valor de retorno é gerado pelo método do chamado e enviado ao chamador.O valor de retorno é empurrado para a pilha.
A calli instrução chama o ponteiro de entrada do método com os argumentos arg1 através argNde . Os tipos destes argumentos são descritos pela convenção específica de chamada (callSiteDesc). A calli instrução pode ser imediatamente precedida por um tail prefixo (Tailcall) para especificar que o estado atual do método deve ser libertado antes de transferir o controlo. Se a chamada transferir o controlo para um método de maior confiança do que o método de origem, o frame de pilha não será libertado; em vez disso, a execução continuará silenciosamente, como se não tivessem tail sido fornecidas.
Assume-se que o ponteiro de entrada do método é um ponteiro específico para código nativo (da máquina de destino) que pode ser legitimamente chamado com os argumentos descritos pela convenção de chamada (um token de metadados para uma assinatura autónoma). Tal ponteiro pode ser criado usando as Ldftn instruções ou Ldvirtftn , ou passado a partir de código nativo.
A convenção de chamada não é verificada dinamicamente, pelo que o código que usa uma calli instrução não funciona corretamente se o destino não usar efetivamente a convenção de chamada especificada.
Os argumentos são colocados na pilha em ordem da esquerda para a direita. Ou seja, o primeiro argumento é calculado e colocado na pilha, depois o segundo, depois o terceiro, até que todos os argumentos necessários estejam no topo da pilha em ordem decrescente. A sequência de código de construção de argumentos para uma instância ou método virtual deve empurrar essa referência de instância (que não pode ser uma referência nula) antes de qualquer um dos argumentos visíveis pelo utilizador.
SecurityException pode ser lançado se a segurança do sistema não conceder ao chamador acesso ao método chamado. A verificação de segurança pode ocorrer quando as instruções da Microsoft Intermediate Language (MSIL) são convertidas para código nativo, em vez de em tempo de execução.
Os seguintes EmitCalli métodos podem ser usados para executar uma calli instrução na pilha. Note que calli deve ser chamado através dos métodos abaixo em vez de usar a Emit classe para colocar a instrução diretamente na pilha.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) para chamadas usando uma convenção de chamadas geridas.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) para chamadas que utilizam uma convenção de chamadas não geridas.