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
arg1
por meioargN
de são enviados por push para a pilha.O ponteiro de entrada do método é enviado por push para a pilha.
Os argumentos
arg1
de método por meioargN
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.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.