Share via


Método IMetaDataEmit::DefineMethod

Cria uma definição para um método ou função global com a assinatura especificada e retorna um token para essa definição de método.

Sintaxe

HRESULT DefineMethod (
    [in]  mdTypeDef         td,
    [in]  LPCWSTR           szName,
    [in]  DWORD             dwMethodFlags,
    [in]  PCCOR_SIGNATURE   pvSigBlob,
    [in]  ULONG             cbSigBlob,
    [in]  ULONG             ulCodeRVA,
    [in]  DWORD             dwImplFlags,
    [out] mdMethodDef      *pmd  
);  

Parâmetros

td
[in] O token mdTypedef da classe pai ou da interface pai do método. Defina td como mdTokenNil se você estiver definindo uma função global.

szName
[in] O nome do membro em Unicode.

dwMethodFlags
[in] Um valor da enumeração CorMethodAttr que especifica os atributos do método ou da função global.

pvSigBlob
[in] A assinatura do método. A assinatura é mantida conforme fornecido. Se você precisar especificar informações adicionais para quaisquer parâmetros, use o método IMetaDataEmit::SetParamProps.

cbSigBlob
[in] A contagem de bytes em pvSigBlob.

ulCodeRVA
[in] O endereço do código.

dwImplFlags
[in] Um valor da enumeração CorMethodImpl que especifica os recursos de implementação do método.

pmd
[out] O token de membro.

Comentários

A API de metadados garante persistir métodos na mesma ordem em que o chamador os emite para uma determinada classe ou interface delimitadora, que é especificada no parâmetro td.

Informações adicionais sobre o uso de DefineMethod e configurações de parâmetro específicas são fornecidos abaixo.

Slots na tabela V

O runtime usa definições de método para configurar slots da tabela V. No caso em que um ou mais slots precisam ser ignorados, como para preservar a paridade com um layout de interface COM, um método fictício é definido para ocupar o slot ou slots na tabela v; defina o dwMethodFlags para o valor mdRTSpecialName da enumeração CorMethodAttr e especifique o nome como:

_VtblGap<SequenceNumber><_CountOfSlots>

em que SequenceNumber é o número de sequência do método e CountOfSlots é o número de slots a serem pulados na tabela V. Se CountOfSlots for omitido, 1 será pressuposto. Esses métodos fictícios não podem ser chamados de código gerenciado ou não gerenciado e qualquer tentativa de chamá-los, de código gerenciado ou não gerenciado, gera uma exceção. A única finalidade deles é ocupar espaço na tabela V que o runtime gera para integração com COM.

Métodos duplicados

Você não deve definir métodos duplicados. Ou seja, você não deve chamar DefineMethod com um conjunto duplicado de valores nos parâmetros td, wzName e pvSig. (Esses três parâmetros juntos definem exclusivamente o método). No entanto, você pode usar um triplo duplicado desde que, para uma das definições de método. Defina o bit mdPrivateScope no parâmetro dwMethodFlags. (O bit mdPrivateScope significa que o compilador não emitirá uma referência a essa definição de método.)

Informações de implementação do método

As informações sobre a implementação do método geralmente não são conhecidas no momento em que o método é declarado. Portanto, você não precisa passar valores nos parâmetros ulCodeRVA e dwImplFlags ao chamar DefineMethod. Os valores podem ser fornecidos posteriormente por meio de IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, conforme apropriado.

Em algumas situações, como cenários de invocação de plataforma (PInvoke) ou interoperabilidade COM, o corpo do método não será fornecido e ulCodeRVA deve ser definido como zero. Nessas situações, o método não deve ser marcado como abstrato, pois o runtime localizará a implementação.

Definindo um método para PInvoke

Para que cada função não gerenciada seja chamada por meio do PInvoke, você deve definir um método gerenciado que represente a função não gerenciada de destino. Para definir o método gerenciado, use DefineMethod com alguns dos parâmetros definidos para determinados valores, dependendo da maneira como o PInvoke é usado:

  • True PInvoke – envolve a invocação de um método não gerenciado externo que reside em uma DLL não gerenciada.

  • PInvoke local – envolve a invocação de um método nativo não gerenciado inserido no módulo gerenciado atual.

As configurações de parâmetro são fornecidas na tabela a seguir.

Parâmetro Valores para o PInvoke verdadeiro Valores do PInvoke local
dwMethodFlags Definir mdStatic; desmarcar mdSynchronized e mdAbstract.
pvSigBlob Uma assinatura de método CLR (common language runtime) válida com parâmetros que são tipos gerenciados válidos. Uma assinatura de método CLR (common language runtime) válida com parâmetros que são tipos gerenciados válidos.
ulCodeRVA 0
dwImplFlags Definir miCil e miManaged. Definir miNative e miUnmanaged.

Requisitos

Plataformas: confira Requisitos do sistema.

Cabeçalho: Cor.h

Biblioteca: usada como um recurso no MsCorEE.dll

Versões do .NET Framework: Disponíveis desde a versão 1.0

Confira também