Partilhar via


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 MSIL (Microsoft Intermediate Language) da instrução, juntamente com um breve resumo de referência:

Formatar Formato de assembly Descrição
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 argN enviados arg1 por push para a pilha.

  2. Os argumentos de método por meio argN são exibidos arg1 da pilha; a chamada de método é executada com esses argumentos e o controle é transferido para o método referenciado pelo descritor de método. Quando concluído, um valor retornado é gerado pelo método 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 a ser chamado 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 confiança mais alta 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 o tail não tivesse sido fornecido. O token de metadados contém 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 é calculado e colocado na pilha, depois o segundo argumento, depois o 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 pelo 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, ela 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 call instrução ou callvirt .

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

Observação

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 mais detalhadamente no Constrained opcode.

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

Observação

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

Aplica-se a