Condividi tramite


Metodo IMetaDataEmit::DefineMethod

Crea una definizione per un metodo o una funzione globale con la firma specificata e restituisce un token per tale definizione.

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 sta definendo una funzione globale.

  • szName
    [in] Nome del 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 così come viene fornita. Se è necessario specificare informazioni aggiuntive per il qualsiasi parametro, utilizzare 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 del membro.

Note

L'API dei metadati garantisce che i metodi vengano mantenuti nello stesso ordine in cui vengono generati dal chiamante per una determinata classe o interfaccia contenitore, specificata nel parametro td.

Di seguito vengono fornite ulteriori informazioni sull'utilizzo di DefineMethod e alcune impostazioni particolari dei parametri.

Slot nella tabella v-table

Il runtime utilizza le definizioni dei metodi per impostare gli slot della tabella v-table. Nel caso in cui sia necessario ignorare uno o più slot, ad esempio per mantenere la parità con un layout di interfaccia COM, viene definito un metodo fittizio per occupare gli slot nella v-table. Impostare dwMethodFlags sul valore mdRTSpecialName dell'enumerazione CorMethodAttr e specificare il nome come segue:

_VtblGap<NumeroSequenza><_NumeroDiSlot>

dove NumeroSequenza è il numero di sequenza del metodo e NumeroDiSlot è il numero di slot da ignorare nella tabella v-table. Se NumeroDiSlot viene omesso, verrà utilizzato 1. Questi metodi fittizi non possono essere chiamati da codice gestito o non gestito e qualsiasi tentativo di chiamarli dall'uno o dall'altro tipo di codice darà luogo a un'eccezione. Hanno infatti come unico scopo quello di occupare spazio nella tabella v-table generata dal runtime per l'integrazione COM.

Metodi duplicati

Non definire metodi duplicati. In altri termini, non chiamare DefineMethod con un set di valori duplicato nei parametri td, wzName e pvSig. Questi tre parametri insieme definiscono in modo univoco il metodo. È comunque possibile utilizzare una serie di tre parametri duplicata purché, per una delle definizioni dei metodi, si imposti il bit mdPrivateScope nel parametro dwMethodFlags. Il bit mdPrivateScope sta a indicare che il compilatore non genererà un riferimento a tale definizione di metodo.

Informazioni sull'implementazione dei metodi

Le informazioni relative all'implementazione dei metodi spesso non sono note al momento della dichiarazione del metodo. Non è pertanto necessario passare valori nei parametri ulCodeRVA e dwImplFlags quando si chiama DefineMethod. I valori possono essere forniti in un secondo momento tramite IMetaDataEmit::SetMethodImplFlags o IMetaDataEmit::SetRVA, in base alle proprie esigenze.

In alcune situazioni, ad esempio con scenari di PInvoke o di interoperabilità COM, il corpo del metodo non verrà fornito e il valore ulCodeRVA dovrà essere impostato su zero. In questi casi, il metodo non deve essere contrassegnato come astratto perché il runtime individuerà l'implementazione.

Definizione di un metodo per PInvoke

Perché ogni funzione non gestita venga chiamata tramite PInvoke, è necessario definire un metodo gestito che rappresenti la funzione non gestita di destinazione. Per definire il metodo gestito, utilizzare DefineMethod con alcuni dei parametri impostati su determinati valori, a seconda della modalità di utilizzo di PInvoke:

  • PInvoke reale. Comporta la chiamata di un metodo non gestito esterno che risiede in una DLL non gestita.

  • PInvoke locale. Comporta la chiamata a un metodo non gestito nativo incorporato nel modulo gestito corrente.

Nella tabella riportata di seguito vengono fornite le impostazioni dei parametri.

Parametro

Valori per PInvoke reale

Valori per PInvoke locale

dwMethodFlags

Impostare mdStatic. Non impostare mdSynchronized e mdAbstract.

pvSigBlob

Firma valida del metodo di Common Language Runtime con parametri che siano tipi gestiti validi.

Firma valida del metodo di Common Language Runtime con parametri che siano 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: utilizzata come risorsa in MSCorEE.dll

Versioni di .NET Framework: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0

Vedere anche

Riferimenti

Interfaccia IMetaDataEmit

Interfaccia IMetaDataEmit2