OpCodes.Calli Campo
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
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, é:
Os argumentos de método
arg1por meioargNde são enviados por push para a pilha.O ponteiro de entrada do método é enviado por push para a pilha.
Os argumentos
arg1de método por meioargNde 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.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.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) para chamadas usando uma convenção de chamada gerenciada.
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) para chamadas que usam uma convenção de chamada não gerenciada.