Partilhar via


Método IMetaDataEmit::D efineMethod

Cria uma definição para um método ou função global com a assinatura especificada e devolve um token a 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 mdTypedef token da classe principal ou interface principal do método. Defina td como mdTokenNil, se estiver a definir uma função global.

szName
[in] O nome do membro no 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 precisar de especificar informações adicionais para quaisquer parâmetros, utilize 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 as funcionalidades de implementação do método.

pmd
[fora] O token de membro.

Observações

A API de metadados garante que os métodos persistem pela mesma ordem que o autor da chamada os emite para uma determinada classe ou interface, que é especificada no td parâmetro.

Abaixo, são fornecidas informações adicionais sobre a utilização e DefineMethod definições de parâmetros específicas.

Blocos na tabela V

O runtime utiliza definições de método para configurar blocos de tabela v. No caso de um ou mais blocos precisarem de ser ignorados, por exemplo, para preservar a paridade com um esquema de interface COM, é definido um método fictício para ocupar o bloco ou blocos na tabela v; defina o dwMethodFlags para o mdRTSpecialName valor da enumeração CorMethodAttr e especifique o nome como:

<_VtblGapSequenceNumber><_CountOfSlots>

em que SequenceNumber é o número de sequência do método e CountOfSlots é o número de blocos a ignorar na tabela v. Se CountOfSlots for omitido, é assumido 1. Estes métodos fictícios não podem ser chamados a partir de código gerido ou não gerido e qualquer tentativa de chamá-los, a partir de código gerido ou não gerido, gera uma exceção. O seu único objetivo é ocupar espaço na v-table que o runtime gera para a integração COM.

Métodos Duplicados

Não deve definir métodos duplicados. Ou seja, não deve chamar DefineMethod com um conjunto duplicado de valores nos tdparâmetros , wzNamee pvSig . (Estes três parâmetros em conjunto definem exclusivamente o método.). No entanto, pode utilizar um triplo duplicado desde que, para uma das definições do método, defina o mdPrivateScope bit no dwMethodFlags parâmetro. (O mdPrivateScope bit significa que o compilador não emitirá uma referência a esta definição de método.)

Informações de Implementação do Método

Muitas vezes, as informações sobre a implementação do método não são conhecidas no momento em que o método é declarado. Por conseguinte, não precisa de transmitir valores nos parâmetros e dwImplFlags ao ulCodeRVA chamar DefineMethod. Os valores podem ser fornecidos mais tarde através de IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, conforme adequado.

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

Definir um Método para PInvoke

Para que cada função não gerida seja chamada através do PInvoke, tem de definir um método gerido que represente a função não gerida de destino. Para definir o método gerido, utilize DefineMethod com alguns dos parâmetros definidos para determinados valores, consoante a forma como o PInvoke é utilizado:

  • True PInvoke – envolve a invocação de um método externo não gerido que reside num DLL não gerido.

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

As definições de parâmetros são dadas na tabela seguinte.

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

Requisitos

Plataformas: Veja Requisitos do Sistema.

Cabeçalho: Cor.h

Biblioteca: Utilizado como recurso no MSCorEE.dll

.NET Framework Versões: Disponível desde 1.0

Ver também