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