Método IMetaDataEmit::D efineMethod
Cria uma definição para um método ou função global com a assinatura especificada e devolve um token a 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 mdTypedef
token da classe principal ou interface principal do método. Defina td
como mdTokenNil
, se estiver a definir 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 da função global.
pvSigBlob
[in] A assinatura do método. A assinatura é mantida conforme fornecido. Se precisar de especificar informações adicionais para quaisquer parâmetros, utilize 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 as funcionalidades de implementação do método.
pmd
[fora] O token de membro.
Observações
A API de metadados garante que os métodos persistem pela mesma ordem que o autor da chamada os emite para uma determinada classe ou interface, que é especificada no td
parâmetro.
Abaixo, são fornecidas informações adicionais sobre a utilização e DefineMethod
definições de parâmetros específicas.
Blocos na tabela V
O runtime utiliza definições de método para configurar blocos de tabela v. No caso de um ou mais blocos precisarem de ser ignorados, por exemplo, para preservar a paridade com um esquema de interface COM, é definido um método fictício para ocupar o bloco ou blocos na tabela v; defina o dwMethodFlags
para o mdRTSpecialName
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 blocos a ignorar na tabela v. Se CountOfSlots for omitido, é assumido 1. Estes métodos fictícios não podem ser chamados a partir de código gerido ou não gerido e qualquer tentativa de chamá-los, a partir de código gerido ou não gerido, gera uma exceção. O seu único objetivo é ocupar espaço na v-table que o runtime gera para a integração COM.
Métodos Duplicados
Não deve definir métodos duplicados. Ou seja, não deve chamar DefineMethod
com um conjunto duplicado de valores nos td
parâmetros , wzName
e pvSig
. (Estes três parâmetros em conjunto definem exclusivamente o método.). No entanto, pode utilizar um triplo duplicado desde que, para uma das definições do método, defina o mdPrivateScope
bit no dwMethodFlags
parâmetro. (O mdPrivateScope
bit significa que o compilador não emitirá uma referência a esta definição de método.)
Informações de Implementação do Método
Muitas vezes, as informações sobre a implementação do método não são conhecidas no momento em que o método é declarado. Por conseguinte, não precisa de transmitir valores nos parâmetros e dwImplFlags
ao ulCodeRVA
chamar DefineMethod
. Os valores podem ser fornecidos mais tarde através de IMetaDataEmit::SetMethodImplFlags ou IMetaDataEmit::SetRVA, conforme adequado.
Em algumas situações, como a invocação da plataforma (PInvoke) ou cenários de interop COM, o corpo do método não será fornecido e ulCodeRVA
deve ser definido como zero. Nestas situações, o método não deve ser marcado como abstrato, uma vez que o runtime irá localizar a implementação.
Definir um Método para PInvoke
Para que cada função não gerida seja chamada através do PInvoke, tem de definir um método gerido que represente a função não gerida de destino. Para definir o método gerido, utilize DefineMethod
com alguns dos parâmetros definidos para determinados valores, consoante a forma como o PInvoke é utilizado:
True PInvoke – envolve a invocação de um método externo não gerido que reside num DLL não gerido.
PInvoke local – envolve a invocação de um método não gerido nativo incorporado no módulo gerido atual.
As definições de parâmetros são dadas na tabela seguinte.
Parâmetro | Valores do verdadeiro PInvoke | Valores do PInvoke local |
---|---|---|
dwMethodFlags |
Defina mdStatic ; desmarque mdSynchronized e mdAbstract . |
|
pvSigBlob |
Uma assinatura de método clR (common runtime) de linguagem válida com parâmetros que são tipos geridos válidos. | Uma assinatura de método CLR válida com parâmetros que são tipos geridos válidos. |
ulCodeRVA |
0 | |
dwImplFlags |
Definir miCil e miManaged . |
Definir miNative e miUnmanaged . |
Requisitos
Plataformas: Veja Requisitos do Sistema.
Cabeçalho: Cor.h
Biblioteca: Utilizado como recurso no MSCorEE.dll
.NET Framework Versões: Disponível desde 1.0