OpCodes.Call Campo
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
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, é:
Os argumentos
arg1do método atravésargNsão empurrados para a pilha.Os argumentos
arg1do método atravésargNsã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.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:
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
thisapontador; em vez disso, usa um bit para indicar se o método requer passar othisapontador.É válido chamar um método virtual usando
call(em vez decallvirt); 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.Note que o método de
Invokeum delegado pode ser chamado com acallinstruçã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: