Share via


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 dwMethodFlagsmdRTSpecialName 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 tdparametri , wzNamee 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

Vedi anche