Partilhar via


IMetaDataEmit::DefineMethod Method

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.

Syntax

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
);

Parameters

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

szName [em] O nome do membro em Unicode.

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

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

cbSigBlob [em] A contagem de bytes em pvSigBlob.

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

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

pmd [saídas] O token de membro.

Remarks

A API de metadados garante a persistência de métodos na mesma ordem em que o chamador os emite para uma determinada classe ou interface de inclusão, que é especificada no td parâmetro.

Seguem-se informações adicionais sobre a utilização e definições específicas de DefineMethod parâmetros.

Ranhuras na tabela V

O tempo de execução usa definições de método para configurar slots v-table. No caso de um ou mais slots precisarem 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 v-table; defina o dwMethodFlags para o mdRTSpecialName valor da enumeração CorMethodAttr e especifique o nome como:

<_VtblGapSequenceNumber><_CountOfSlots>

onde SequenceNumber é o número de sequência do método e CountOfSlots é o número de slots a serem ignorados na v-table. Se CountOfSlots for omitido, 1 será assumido. Esses métodos fictícios não são chamáveis a partir 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. Seu único objetivo é ocupar espaço na v-table que o tempo de execução gera para integração COM.

Duplicate Methods

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

Informações sobre a implementação do método

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

Em algumas situações, como invocação de plataforma (PInvoke) ou cenários de 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, porque o tempo de execução localizará a implementação.

Definindo um método para PInvoke

Para cada função não gerenciada a ser chamada através 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 externo não gerenciado que reside em uma DLL não gerenciada.

  • PInvoke local - envolve a invocação de um método não gerenciado nativo que está incorporado no módulo gerenciado atual.

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

Parameter Valores para PInvoke verdadeiro Valores para PInvoke local
dwMethodFlags Definir mdStatic; claro mdSynchronized e mdAbstract.
pvSigBlob Uma assinatura válida do método CLR (Common Language Runtime) com parâmetros que são tipos gerenciados válidos. Uma assinatura de método CLR válida com parâmetros que são tipos gerenciados válidos.
ulCodeRVA 0
dwImplFlags Conjunto miCil e miManaged. Conjunto miNative e miUnmanaged.

Requirements

Plataformas: Consulte Sistemas operacionais suportados pelo .NET.

Header: Cor.h

Library: CorGuids.lib

See also