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.
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, der die Attribute der Methode oder globalen Funktion angibt.pvSigBlob
[in] Die Methodensignatur. Die Signatur wird beibehalten wie angegeben. Wenn Sie zusätzliche Informationen für Parameter angeben müssen, verwenden Sie die IMetaDataEmit::SetParamProps-Methode.cbSigBlob
[in] Die Anzahl der Bytes in pvSigBlob.ulCodeRVA
[in] Die Adresse des Codes.dwImplFlags
[in] Ein Wert der CorMethodImpl-Enumeration, der die Implementierungsfeatures der Methode angibt.pmd
[out] Das Membertoken.
Hinweise
Die Metadaten-API garantiert, Methoden in der Reihenfolge beizubehalten, wie der Aufrufer sie für eine bestimmte einschließende Klasse oder Schnittstelle ausgibt; dies ist im td-Parameter angegeben.
Zusätzliche Informationen hinsichtlich der Verwendung von DefineMethod und besondere Parametereinstellungen finden Sie weiter unten.
Slots in der V-Tabelle
Die Laufzeit verwendet Methodendefinitionen, um V-Tabellenslots einzurichten. Wenn einer oder mehrere Slots übersprungen werden müssen, um z. B. die Parität mit einem COM-Schnittstellenlayout zu erhalten, wird eine Dummymethode definiert, um den oder die Slots in die V-Tabelle aufzunehmen. Legen Sie dwMethodFlags auf den mdRTSpecialName-Wert der CorMethodAttr-Enumeration fest, und geben Sie den Namen folgendermaßen an:
_VtblGap<SequenceNumber><_CountOfSlots>
wobei SequenceNumber die Sequenznummer der Methode ist und CountOfSlots die Anzahl der Slots angibt, die in der V-Tabelle übersprungen werden sollen. Wird CountOfSlots ausgelassen, so wird 1 angenommen. Diese Dummymethoden können weder von verwaltetem noch von nicht verwaltetem Code aufgerufen werden. Bei einem Versuch, sie von verwaltetem oder nicht verwaltetem Code aufzurufen, wird eine Ausnahme generiert. Ihr Zweck besteht ausschließlich darin, Platz in der V-Tabelle zu belegen, die die Laufzeit für die COM-Integration generiert.
Doppelte Methoden
Sie sollten keine doppelten Methoden definieren. Rufen Sie also nicht DefineMethod mit einem doppelten Wertesatz in den Parametern td, wzName und pvSig auf. (Diese drei Parameter zusammen definieren die Methode eindeutig.) Sie können jedoch ein doppeltes Tripel unter der Voraussetzung verwenden, dass Sie für eine der Methodendefinitionen das mdPrivateScope-Bit im dwMethodFlags-Parameter festlegen. (Das mdPrivateScope-Bit bedeutet, dass der Compiler keinen Verweis auf diese Methodendefinition ausgibt.)
Informationen zur Methodenimplementierung
Informationen zur Methodenimplementierung sind zum Zeitpunkt der Deklaration der Methode oft nicht bekannt. Deshalb müssen Sie keine Werte im ulCodeRVA-Parameter und im dwImplFlags-Parameter übergeben, wenn Sie DefineMethod aufrufen. Die Werte können später durch IMetaDataEmit::SetMethodImplFlags oder IMetaDataEmit::SetRVA entsprechend angegeben werden.
In einigen Situationen, z. B. Plattformaufruf (PInvoke) oder COM-Interop-Szenarios, wird der Methodentext nicht bereitgestellt und ulCodeRVA sollte auf 0 (null) festgelegt werden. In diesen Situationen sollte die Methode nicht als abstrakt markiert werden, da die Laufzeit die Implementierung suchen wird.
Definieren einer Methode für PInvoke
Damit die einzelnen nicht verwalteten Funktionen über PInvoke aufgerufen werden können, müssen Sie eine verwaltete Methode definieren, die die nicht verwaltete Zielfunktion darstellt. Verwenden Sie für die Definition der verwalteten Methode DefineMethod mit bestimmten Werten für einige der Parameter, je nach Verwendung von PInvoke:
true PInvoke - schließt den Aufruf einer externen nicht verwalteten Methode ein, die sich in einer nicht verwalteten DLL befindet.
local PInvoke - schließt den Aufruf einer systemeigenen nicht verwalteten Methode ein, die im aktuellen verwalteten Modul eingebettet ist.
Die Parametereinstellungen werden in der folgenden Tabelle angegeben.
Parameter |
Werte für true PInvoke |
Werte für local PInvoke |
---|---|---|
dwMethodFlags |
Legen Sie mdStatic fest, löschen Sie mdSynchronized und mdAbstract. |
|
pvSigBlob |
Eine gültige Common Language Runtime-(CLR-)Methodensignatur mit Parametern, die gültige verwaltete Typen sind. |
Eine gültige CLR-Methodensignatur mit Parametern, die gültige verwaltete Typen sind. |
ulCodeRVA |
0 |
|
dwImplFlags |
Legen Sie miCil und miManaged fest. |
Legen Sie miNative und miUnmanaged fest. |
Anforderungen
Plattformen: siehe Systemanforderungen für .NET Framework.
Header: Cor.h
Bibliothek: als Ressource in MSCorEE.dll verwendet
.NET Framework-Versionen: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0