Compartilhar via


Método de IMetaDataEmit::DefineMethod

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

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 pai ou na interface do pai do método. Definir td para mdTokenNil, se você estiver definindo uma função global.

  • szName
    [in] O nome do membro em Unicode.

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

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

  • cbSigBlob
    [in] A contagem de bytes em pvSigBlob.

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

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

  • pmd
    [out] O token de membro.

Comentários

Os metadados API garante persistir os métodos na mesma ordem emite o chamador-los para uma determinada classe de delimitador ou interface, que é especificado na td parâmetro.

Informações adicionais sobre o uso de DefineMethod e configurações de determinado parâmetro é fornecido abaixo.

Slots na tabela de v

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

_ VtblGap <SequenceNumber>< _CountOfSlots>

onde SequenceNumber é o número de seqüência do método e CountOfSlots é o número de slots para ignorar a tabela de v. Se CountOfSlots é omitido, 1 será utilizado. Esses métodos fictícios não podem ser chamados a partir do código gerenciado ou e qualquer tentativa de chamá-los, a partir do código gerenciado ou, gera uma exceção. Sua única finalidade é a ocupar espaço v-tabela gerada pelo runtime para integração do COM.

Métodos duplicados

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

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

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 a ulCodeRVA e dwImplFlags parâmetros ao chamar DefineMethod. Os valores podem ser fornecidos posteriormente por meio IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, conforme apropriado.

Em algumas situações, como, por exemplo, a 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 deve não marcado como abstrato, porque o runtime irá localizar a implementação.

Definindo um método para PInvoke

Para cada função não gerenciada ser chamados por meio de PInvoke, você deve definir um método gerenciado que representa a função de destino não gerenciado. Para definir o método gerenciado, use DefineMethod com alguns dos parâmetros definidos para certos valores, dependendo da forma em que é usado o PInvoke:

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

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

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

Parâmetro

Valores de PInvoke true

Valores de PInvoke local

dwMethodFlags

Set mdStatic; clear mdSynchronized and mdAbstract.

pvSigBlob

Válido common language runtime (CLR) assinatura de um método com parâmetros são válidos de tipos gerenciados.

Uma assinatura de método válida do CLR com os parâmetros são válidos de tipos gerenciados.

ulCodeRVA

0

dwImplFlags

Set miCil and miManaged.

Set miNative and miUnmanaged.

Requisitos

Plataformas: Consulte Requisitos de sistema do .NET Framework.

Cabeçalho: Cor.h

Biblioteca: Usado como um recurso em mscoree

.NET Framework versões: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0

Consulte também

Referência

Interface de IMetaDataEmit

Interface de IMetaDataEmit2