Método IMetaDataEmit::DefineMethod
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.
Sintaxe
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 token mdTypedef
da classe pai ou da interface pai do método. Defina td
como mdTokenNil
se você estiver definindo uma função global.
szName
[in] O nome do membro em Unicode.
dwMethodFlags
[in] Um valor da enumeração CorMethodAttr que especifica os atributos do método ou da função global.
pvSigBlob
[in] A assinatura do método. A assinatura é mantida conforme fornecido. Se você precisar especificar informações adicionais para quaisquer parâmetros, 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.
Comentários
A API de metadados garante persistir métodos na mesma ordem em que o chamador os emite para uma determinada classe ou interface delimitadora, que é especificada no parâmetro td
.
Informações adicionais sobre o uso de DefineMethod
e configurações de parâmetro específicas são fornecidos abaixo.
Slots na tabela V
O runtime usa definições de método para configurar slots da tabela V. No caso em que um ou mais slots precisam 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 tabela v; defina o dwMethodFlags
para o valor mdRTSpecialName
da enumeração CorMethodAttr e especifique o nome como:
_VtblGap<SequenceNumber><_CountOfSlots>
em que SequenceNumber é o número de sequência do método e CountOfSlots é o número de slots a serem pulados na tabela V. Se CountOfSlots for omitido, 1 será pressuposto. 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. A única finalidade deles é ocupar espaço na tabela V que o runtime gera para integração com COM.
Métodos duplicados
Você não deve definir métodos duplicados. Ou seja, você não deve chamar DefineMethod
com um conjunto duplicado de valores nos parâmetros td
, wzName
e pvSig
. (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 bit mdPrivateScope
no parâmetro dwMethodFlags
. (O bit mdPrivateScope
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 nos parâmetros ulCodeRVA
e dwImplFlags
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 invocação de plataforma (PInvoke) ou 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, 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 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 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.
Parâmetro | Valores para o PInvoke verdadeiro | Valores do PInvoke local |
---|---|---|
dwMethodFlags |
Definir mdStatic ; desmarcar 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 (common language runtime) válida com parâmetros que são tipos gerenciados válidos. |
ulCodeRVA |
0 | |
dwImplFlags |
Definir miCil e miManaged . |
Definir miNative e miUnmanaged . |
Requisitos
Plataformas: confira Requisitos do sistema.
Cabeçalho: Cor.h
Biblioteca: usada como um recurso no MsCorEE.dll
Versões do .NET Framework: Disponíveis desde a versão 1.0