OpCodes.Call Campo

Definição

Chama o método indicado pelo 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 de Campo

Observações

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

Formato Formato de Montagem Descrição
28 <T> chamada methodDesc Chama-se o método descrito por methodDesc.

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

  1. Os argumentos arg1 do método através argN são empurrados para a pilha.

  2. Os argumentos arg1 do método através argN são extraídos da pilha; a chamada ao método é feita com estes argumentos e o controlo é transferido para o método referido pelo descritor do método. Quando concluído, um valor de retorno é gerado pelo método do chamado e enviado ao chamador.

  3. O valor de retorno é empurrado para a pilha.

A call instrução chama o método indicado pelo descritor do método passado com a instrução. O descritor do método é um token de metadados que indica o método a chamar e o número, tipo e ordem dos argumentos que foram colocados na pilha a passar a esse método, bem como a convenção de chamada a ser utilizada. A call instrução pode ser imediatamente precedida por uma tail instrução prefixo (Tailcall) para especificar que o estado atual do método deve ser libertado antes de transferir o controlo. Se a chamada transferir o controlo para um método de maior confiança do que o método de origem, o frame de pilha não é libertado. Em vez disso, a execução continua silenciosamente, como se não tivessem tail sido fornecidas. O token de metadados transporta informação suficiente 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 estes casos, o endereço de destino é determinado inteiramente a partir do descritor do método (em contraste com a Callvirt instrução para chamar métodos virtuais, onde o endereço de destino também depende do tipo de referência de instância em tempo de execução empurrado antes do Callvirt).

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

  1. As chamadas a um método de instância (ou virtual) devem empurrar essa referência de instância antes de qualquer um dos argumentos visíveis pelo utilizador. A referência de instância não pode ser uma referência nula. A assinatura contida nos metadados não contém uma entrada na lista de parâmetros para o this apontador; em vez disso, usa um bit para indicar se o método requer passar o this apontador.

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

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

SecurityException pode ser lançado 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 da Microsoft Intermediate Language (MSIL) são convertidas para código nativo, em vez de em tempo de execução.

Note

Ao chamar métodos do System.Object sobre tipos de valor, considere usar o prefixo constrained com a callvirt instrução em vez de emitir uma call instrução. Isto elimina a necessidade de emitir diferentes IL dependendo se o tipo de valor sobrepõe ou não o método, evitando um potencial problema de versionamento. Considere usar o prefixo constrained ao invocar métodos de interface em tipos de valor, uma vez que o método de tipo de valor que implementa o método de interface pode ser alterado usando um MethodImpl. Estas questões são descritas com mais detalhe no Constrained opcode.

As seguintes Emit sobrecargas de métodos 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