Freigeben über


IMetaDataEmit::DefineMethod-Methode

Erstellt eine Definition für eine Methode oder globale Funktion mit der angegebenen Signatur und gibt ein Token für diese Methodendefinition zurück.

Syntax

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  
);  

Parameter

td
[in] Das mdTypedef-Token der übergeordneten Klasse oder übergeordneten Schnittstelle der Methode. Legen Sie td auf mdTokenNil fest, wenn Sie eine globale Funktion definieren.

szName
[in] Der Membername in Unicode.

dwMethodFlags
[in] Ein Wert der CorMethodAttr-Enumeration zur Angabe der Attribute der Methode oder der globalen Funktion.

pvSigBlob
[in] Die Methodensignatur. Die Signatur wird wie angegeben beibehalten. Wenn Sie zusätzliche Informationen für Parameter angeben müssen, verwenden Sie die IMetaDataEmit::SetParamProps-Methode.

cbSigBlob
[in] Die Anzahl von Bytes in pvSigBlob.

ulCodeRVA
[in] Die Adresse des Codes.

dwImplFlags
[in] Ein Wert der CorMethodImpl-Enumeration zur Angabe der Implementierungsfeatures der Methode.

pmd
[out] Das Membertoken.

Bemerkungen

Die Metadaten-API garantiert, dass Methoden in der Reihenfolge beibehalten werden, in der der Aufrufer sie für eine bestimmte einschließende Klasse oder Schnittstelle ausgibt (angegeben im td-Parameter).

Weitere Informationen zur Verwendung von DefineMethod und zu den speziellen Parametereinstellungen finden Sie unten.

Slots in der V-Tabelle

Die Runtime verwendet Methodendefinitionen, um V-Tabellenslots einzurichten. Für den Fall, dass einer oder mehrere der Slots übersprungen werden müssen (etwa um die Parität mit einem COM-Schnittstellenlayout zu erhalten), wird eine Dummymethode definiert, um den Slot oder die Slots in der V-Tabelle einzunehmen. Legen Sie dwMethodFlags auf den mdRTSpecialName-Wert der CorMethodAttr-Enumeration fest, und geben Sie den Namen wie folgt an:

_VtblGap<Sequenznummer><_Slotanzahl>

Dabei ist Sequenznummer die Sequenznummer der Methode und Slotanzahl die Anzahl von Slots, die in der V-Tabelle übersprungen werden sollen. Ohne Angabe von Sequenznummer wird dafür der Wert 1 verwendet. Diese Dummymethoden können weder über verwalteten noch über nicht verwalteten Code aufgerufen werden, und jeder Versuch, sie über verwalteten oder nicht verwalteten Code aufzurufen, führt zu einer Ausnahme. Ihr einziger Zweck besteht darin, Platz in der V-Tabelle zu belegen, die die Runtime für die COM-Integration generiert.

Doppelte Methoden

Sie sollten keine doppelten Methoden definieren. Anders ausgedrückt: Rufen Sie DefineMethod nicht mit einem doppelten Satz von Werten in den Parametern td, wzName und pvSig auf. (Durch diese drei Parameter wird die Methode eindeutig definiert.) Sie können jedoch ein doppeltes Tripel verwenden, sofern Sie für eine der Methodendefinitionen im dwMethodFlags-Parameter das mdPrivateScope-Bit festlegen. (Das mdPrivateScope-Bit bedeutet, dass der Compiler keinen Verweis auf diese Methodendefinition ausgibt.)

Informationen zur Methodenimplementierung

Informationen zur Methodenimplementierung sind zum Zeitpunkt der Methodendeklaration häufig nicht bekannt. Daher müssen Sie beim Aufrufen von DefineMethod keine Werte in den Parametern ulCodeRVA und dwImplFlags übergeben. Die Werte können später über IMetaDataEmit::SetMethodImplFlags oder IMetaDataEmit::SetRVA bereitgestellt werden.

In bestimmten Situationen – etwa bei Plattformaufrufen (PInvoke) oder in COM-Interoperabilitätsszenarien – wird der Methodenkörper nicht bereitgestellt, und ulCodeRVA muss auf null festgelegt werden. In diesen Situationen sollte die Methode nicht als abstrakt gekennzeichnet werden, da die Runtime die Implementierung findet.

Definieren einer Methode für PInvoke

Für jede nicht verwaltete Funktion, die über PInvoke aufgerufen werden soll, muss eine verwaltete Methode definiert werden, die die nicht verwaltete Zielfunktion darstellt. Um die verwaltete Methode zu definieren, verwenden Sie DefineMethod, und legen Sie einige der Parameter je nach Verwendung von PInvoke auf bestimmte Werte fest:

  • Echter Plattformaufruf: Umfasst das Aufrufen einer externen nicht verwalteten Methode, die sich in einer nicht verwalteten DLL befindet.

  • Lokaler Plattformaufruf: Umfasst das Aufrufen einer nativen nicht verwalteten Methode, die in das aktuelle verwaltete Modul eingebettet ist.

Die Parametereinstellungen sind in der folgenden Tabelle angegeben:

Parameter Werte für echten Plattformaufruf Werte für lokalen Plattformaufruf
dwMethodFlags Legen Sie mdStatic fest, und löschen Sie mdSynchronized und mdAbstract.
pvSigBlob Eine gültige CLR-Methodensignatur (Common Language Runtime) mit Parametern, bei denen es sich um gültige verwaltete Typen handelt. Eine gültige CLR-Methodensignatur mit Parametern, bei denen es sich um gültige verwaltete Typen handelt.
ulCodeRVA 0
dwImplFlags Legen Sie miCil und miManaged fest. Legen Sie miNative und miUnmanaged fest.

Anforderungen

Plattformen: Informationen finden Sie unter Systemanforderungen.

Header: Cor.h

Bibliothek: Als Ressource in „MSCorEE.dll“ verwendet

.NET Framework-Versionen: Seit Version 1.0 verfügbar

Siehe auch