OpCodes.Call Campo

Definição

Chama o método indicado pelo descritor de método passado.

public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
 staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call As OpCode 

Valor do campo

Comentários

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

Formato Formato de assembly Description
28 <T> Chamar methodDesc Chame o método descrito por methodDesc.

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

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

  2. Os argumentos de método são extraídos arg1argN da pilha; a chamada de método é executada com esses argumentos e o controle é transferido para o método referenciado pelo descritor do método. Quando concluído, um valor retornado é gerado pelo método de destinatário do chamador e enviado ao chamador.

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

A call instrução chama o método indicado pelo descritor de método passado com a instrução. O descritor de método é um token de metadados que indica o método para chamar e o número, o tipo e a ordem dos argumentos que foram colocados na pilha a serem passados para esse método, bem como a convenção de chamada a ser usada. A call instrução pode ser imediatamente precedida por uma tail instrução de 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 maior confiança do que o método de origem, o quadro de pilha não será liberado. Em vez disso, a execução continua silenciosamente como se tail não tivesse sido fornecida. O token de metadados carrega informações suficientes para determinar se a chamada é para um método estático, um método de instância, um método virtual ou uma função global. Em todos esses casos, o endereço de destino é determinado inteiramente do descritor de método (contraste isso com a Callvirt instrução para chamar métodos virtuais, em que o endereço de destino também depende do tipo de runtime da referência de instância enviada por push antes do Callvirt).

Os argumentos são colocados na pilha na ordem da esquerda para a direita. Ou seja, o primeiro argumento é computado e colocado na pilha, depois no segundo argumento, depois no terceiro, até que todos os argumentos necessários estejam em cima da pilha em ordem decrescente. Há três casos especiais importantes:

  1. As chamadas para um método de instância (ou virtual) devem enviar por push essa referência de instância antes de qualquer um dos argumentos visíveis ao usuário. A referência de instância não deve ser uma referência nula. A assinatura carregada nos metadados não contém uma entrada na lista de parâmetros para o this ponteiro; em vez disso, usa um bit para indicar se o método requer passar o this ponteiro.

  2. É válido chamar um método virtual usando call (em vez callvirtde ); isso indica que o método deve ser resolvido usando a classe especificada pelo método em vez de conforme especificado dinamicamente do objeto que está sendo invocado.

  3. Observe que o método de Invoke um delegado pode ser chamado com a instrução ou callvirt a call instrução.

SecurityException poderá ser gerada 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 de Microsoft Linguagem Intermediária (MSIL) são convertidas em código nativo em vez de em tempo de execução.

Note

Ao chamar métodos de System.Object em tipos de valor, considere usar o constrained prefixo com a callvirt instrução em vez de emitir uma call instrução. Isso remove a necessidade de emitir IL diferente dependendo se o tipo de valor substitui ou não o método, evitando um possível problema de controle de versão. Considere usar o constrained prefixo ao invocar métodos de interface em tipos de valor, já que o método de tipo de valor que implementa o método de interface pode ser alterado usando um MethodImpl. Esses problemas são descritos com mais detalhes no Constrained opcode.

As seguintes Emit sobrecargas de método podem usar o call opcode:

Note

O EmitCall método é fornecido para varargs chamadas. Use o Emit método para chamadas normais.

Aplica-se a