Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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