Compartilhar via


OpCodes.Calli Campo

Definição

Chama o método indicado na pilha de avaliação (como um ponteiro 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 do campo

Comentários

A tabela a seguir lista o formato de assembly hexadecimal e MSIL (Microsoft Intermediate Language) da instrução, juntamente com um breve resumo de referência:

Formatar Formato de assembly Descrição
29 <T> Calli callSiteDescr Chama o método apontado com argumentos descritos pela convenção de chamada.

O comportamento de transição da pilha, em ordem sequencial, é:

  1. Os argumentos de método arg1 por meio argN de são enviados por push para a pilha.

  2. O ponteiro de entrada do método é enviado por push para a pilha.

  3. Os argumentos arg1 de método por meio argN de e o ponteiro de entrada do método são exibidos da pilha; a chamada para o método é executada. Quando concluído, um valor retornado é gerado pelo método callee e enviado ao chamador.

  4. O valor retornado é enviado por push para a pilha.

A calli instrução chama o ponteiro de entrada do método com os argumentos arg1 por meio de argN. Os tipos desses argumentos são descritos pela convenção de chamada específica (callSiteDesc). A calli instrução pode ser imediatamente precedida por um tail prefixo (Tailcall) para especificar que o estado do método atual deve ser liberado antes de transferir o controle. Se a chamada transferir o controle para um método de confiança maior do que o método de origem, o registro de ativação não será liberado; Em vez disso, a execução continuará silenciosamente como se o tail não tivesse sido fornecido.

O ponteiro de entrada do método é considerado um ponteiro específico para o código nativo (do computador de destino) que pode ser chamado legitimamente com os argumentos descritos pela convenção de chamada (um token de metadados para uma assinatura autônoma). Esse ponteiro pode ser criado usando as Ldftn instruções ou Ldvirtftn ou passado do código nativo.

A convenção de chamada não é verificada dinamicamente, portanto, o código que usa uma calli instrução não funcionará corretamente se o destino não usar realmente a convenção de chamada especificada.

Os argumentos são colocados na pilha na ordem da esquerda para a direita. Ou seja, o primeiro argumento é calculado e colocado na pilha, depois o segundo argumento, depois o terceiro, até que todos os argumentos necessários estejam sobre a pilha em ordem decrescente. A sequência de código de criação de argumento para uma instância ou método virtual deve efetuar push dessa referência de instância (que não deve ser uma referência nula) antes de qualquer um dos argumentos visíveis ao usuário.

SecurityException poderá ser gerada se a segurança do sistema não conceder ao chamador acesso ao método chamado. A marcar de segurança pode ocorrer quando as instruções da MSIL (Microsoft Intermediate Language) são convertidas em código nativo em vez de em runtime.

EmitCalli Os métodos a seguir podem ser usados para executar uma calli instrução na pilha. Observe que calli deve ser chamado por meio dos métodos abaixo em vez de usar a Emit classe para colocar a instrução diretamente na pilha.

Aplica-se a