Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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