Metodo IMetaDataEmit::DefineMethod
Crea una definizione per un metodo o una funzione globale con la firma specificata e restituisce un token alla definizione del metodo.
Sintassi
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
);
Parametri
td
[in] Token mdTypedef
della classe padre o dell'interfaccia padre del metodo. Impostare td
su mdTokenNil
, se si definisce una funzione globale.
szName
[in] Nome membro in Unicode.
dwMethodFlags
[in] Valore dell'enumerazione CorMethodAttr che specifica gli attributi del metodo o della funzione globale.
pvSigBlob
[in] Firma del metodo. La firma viene mantenuta come specificato. Se è necessario specificare informazioni aggiuntive per qualsiasi parametro, usare il metodo IMetaDataEmit::SetParamProps .
cbSigBlob
[in] Numero di byte in pvSigBlob
.
ulCodeRVA
[in] Indirizzo del codice.
dwImplFlags
[in] Valore dell'enumerazione CorMethodImpl che specifica le funzionalità di implementazione del metodo.
pmd
[out] Token membro.
Commenti
L'API dei metadati garantisce di rendere persistenti i metodi nello stesso ordine del chiamante li genera per una determinata classe o interfaccia racchiusa, specificata nel td
parametro.
Di seguito sono riportate informazioni aggiuntive sull'uso delle impostazioni dei DefineMethod
parametri e specifiche.
Slot nella tabella V
Il runtime usa le definizioni dei metodi per configurare gli slot della tabella v. Nel caso in cui sia necessario ignorare uno o più slot, ad esempio per mantenere la parità con un layout dell'interfaccia COM, viene definito un metodo fittizio per occupare lo slot o gli slot nella tabella v; impostare il dwMethodFlags
mdRTSpecialName
valore dell'enumerazione CorMethodAttr e specificare il nome come:
<_VtblGapSequenceNumber><_CountOfSlots>
dove SequenceNumber è il numero di sequenza del metodo e CountOfSlots è il numero di slot da ignorare nella tabella v. Se CountOfSlots viene omesso, viene assunto 1. Questi metodi fittizi non sono chiamabili dal codice gestito o non gestito e qualsiasi tentativo di chiamarli, da codice gestito o non gestito, genera un'eccezione. Il loro unico scopo è quello di occupare spazio nella tabella v che il runtime genera per l'integrazione COM.
Metodi duplicati
Non è consigliabile definire metodi duplicati. Non è consigliabile chiamare DefineMethod
con un set duplicato di valori nei td
parametri , wzName
e pvSig
. Questi tre parametri definiscono in modo univoco il metodo. Tuttavia, è possibile usare un triplo duplicato fornito che, per una delle definizioni del metodo, è possibile impostare il mdPrivateScope
bit nel dwMethodFlags
parametro. Il mdPrivateScope
bit indica che il compilatore non emetterà un riferimento a questa definizione del metodo.
Informazioni sull'implementazione dei metodi
Le informazioni sull'implementazione del metodo non sono spesso note al momento della dichiarazione del metodo. Pertanto, non è necessario passare i valori nei ulCodeRVA
parametri e dwImplFlags
quando si chiama DefineMethod
. I valori possono essere forniti in un secondo momento tramite IMetaDataEmit::SetMethodImplFlags o IMetaDataEmit::SetRVA, in base alle esigenze.
In alcune situazioni, ad esempio scenari di interoperabilità PInvoke o di chiamata alla piattaforma, il corpo del metodo non verrà fornito e ulCodeRVA
deve essere impostato su zero. In queste situazioni il metodo non deve essere contrassegnato come astratto, perché il runtime individua l'implementazione.
Definizione di un metodo per PInvoke
Per ogni funzione non gestita da chiamare tramite PInvoke, è necessario definire un metodo gestito che rappresenta la funzione non gestita di destinazione. Per definire il metodo gestito, usare DefineMethod
con alcuni dei parametri impostati su determinati valori, a seconda del modo in cui viene usato PInvoke:
True PInvoke: prevede la chiamata di un metodo esterno non gestito che risiede in una DLL non gestita.
PInvoke locale: prevede la chiamata di un metodo non gestito nativo incorporato nel modulo gestito corrente.
Le impostazioni dei parametri vengono specificate nella tabella seguente.
Parametro | Valori per true PInvoke | Valori per PInvoke locale |
---|---|---|
dwMethodFlags |
Impostare mdStatic ; deselezionare mdSynchronized e mdAbstract . |
|
pvSigBlob |
Firma del metodo CLR (Common Language Runtime) valida con parametri che sono tipi gestiti validi. | Firma del metodo CLR valida con parametri che sono tipi gestiti validi. |
ulCodeRVA |
0 | |
dwImplFlags |
Impostare miCil e miManaged . |
Impostare miNative e miUnmanaged . |
Requisiti
Piattaforme: vedere Requisiti di sistema di .NET Framework.
Intestazione: Cor.h
Libreria: Usato come risorsa in MSCorEE.dll
Versioni di .NET Framework: Disponibile da 1.0