Compartilhar 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 [in] O mdTypedef token da classe pai ou da interface pai do método. Definido td como mdTokenNil, se você estiver definindo 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 função global.

pvSigBlob [in] A assinatura do método. A assinatura é mantida conforme fornecido. Se você precisar especificar informações adicionais para qualquer parâmetro, 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.

Remarks

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

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

Slots na tabela V

O runtime usa definições de método para configurar slots de tabela virtual. No caso em que um ou mais slots precisam ser ignorados, como 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 dwMethodFlagsmdRTSpecialName 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 slots a serem ignoradas na tabela v. Se CountOfSlots for omitido, 1 será assumido. 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. Sua única finalidade é ocupar espaço na tabela v que o runtime gera para a integração com 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 e pvSig nos wzNameparâmetros. (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 mdPrivateScope bit no dwMethodFlags parâmetro. (O mdPrivateScope bit 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 e ulCodeRVAdwImplFlags parâmetros 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 interoperabilidade de PInvoke (invocação de plataforma) ou COM, o corpo do método não será fornecido e ulCodeRVA deverá 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 de 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.

Parameter Valores para PInvoke verdadeiro Valores para PInvoke local
dwMethodFlags Definir mdStatic; limpar 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 válida com parâmetros que são tipos gerenciados válidos.
ulCodeRVA 0
dwImplFlags Definir miCil e miManaged. Definir miNative e miUnmanaged.

Requirements

Plataformas: Consulte sistemas operacionais com suporte do .NET.

Header: Cor.h

Library: CorGuids.lib

See also