IMetaDataEmit::DefineMethod — Metoda
Tworzy definicję metody lub funkcji globalnej z określonym podpisem i zwraca token do tej definicji metody.
Składnia
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
);
Parametry
td
[in] Token mdTypedef
klasy nadrzędnej lub interfejsu nadrzędnego metody . Ustaw td
wartość na mdTokenNil
, jeśli definiujesz funkcję globalną.
szName
[in] Nazwa elementu członkowskiego w formacie Unicode.
dwMethodFlags
[in] Wartość wyliczenia CorMethodAttr , która określa atrybuty metody lub funkcji globalnej.
pvSigBlob
[in] Sygnatura metody. Podpis jest utrwalany zgodnie z podanym stanem. Jeśli musisz określić dodatkowe informacje dla dowolnych parametrów, użyj metody IMetaDataEmit::SetParamProps .
cbSigBlob
[in] Liczba bajtów w pliku pvSigBlob
.
ulCodeRVA
[in] Adres kodu.
dwImplFlags
[in] Wartość wyliczenia CorMethodImpl , która określa funkcje implementacji metody.
pmd
[out] Token elementu członkowskiego.
Uwagi
Interfejs API metadanych gwarantuje utrwalanie metod w tej samej kolejności co obiekt wywołujący emituje je dla danej otaczającej klasy lub interfejsu określonego w parametrze td
.
Poniżej podano dodatkowe informacje dotyczące używania i określonych ustawień parametrów DefineMethod
.
Miejsca w tabeli V-table
Środowisko uruchomieniowe używa definicji metod do konfigurowania gniazd tabel wirtualnych. W przypadku, gdy należy pominąć jedno lub więcej gniazd, na przykład w celu zachowania parzystości z układem interfejsu COM, zdefiniowano fikcyjną metodę w celu przejęcia miejsca lub miejsc w tabeli wirtualnej; dwMethodFlags
ustaw wartość mdRTSpecialName
na wartość wyliczenia CorMethodAttr i określ nazwę jako:
<_VtblGapSequenceNumber><_CountOfSlots>
gdzie SequenceNumber jest numerem sekwencji metody i CountOfSlots jest liczbą miejsc do pominięcia w tabeli v-table. Jeśli parametr CountOfSlots zostanie pominięty, przyjmuje się, że przyjmuje się, że 1. Te fikcyjne metody nie są wywoływane z zarządzanego lub niezarządzanego kodu i każda próba wywołania ich z zarządzanego lub niezarządzanego kodu generuje wyjątek. Ich jedynym celem jest zajęcie miejsca w tabeli wirtualnej generowanej przez środowisko uruchomieniowe na potrzeby integracji modelu COM.
Zduplikowane metody
Nie należy definiować zduplikowanych metod. Oznacza to, że nie należy wywoływać DefineMethod
zduplikowanego zestawu wartości w parametrach td
, wzName
i pvSig
. (Te trzy parametry jednoznacznie definiują metodę). Można jednak użyć zduplikowanego potrójnego, pod warunkiem, że dla jednej z definicji metody ustawisz mdPrivateScope
bit w parametrze dwMethodFlags
. (Bit mdPrivateScope
oznacza, że kompilator nie będzie emitować odwołania do tej definicji metody).
Informacje o implementacji metody
Informacje o implementacji metody często nie są znane w czasie deklarowanej metody. W związku z tym nie trzeba przekazywać wartości w parametrach ulCodeRVA
i dwImplFlags
podczas wywoływania metody DefineMethod
. Wartości można później dostarczyć za pomocą elementu IMetaDataEmit::SetMethodImplFlags lub IMetaDataEmit::SetRVA, odpowiednio.
W niektórych sytuacjach, takich jak wywołanie platformy (PInvoke) lub scenariusze międzyoperacyjności MODELU COM, treść metody nie zostanie dostarczona i ulCodeRVA
powinna być ustawiona na zero. W takich sytuacjach metoda nie powinna być oznaczona jako abstrakcyjna, ponieważ środowisko uruchomieniowe zlokalizuje implementację.
Definiowanie metody dla funkcji PInvoke
Dla każdej niezarządzanej funkcji, która ma być wywoływana za pośrednictwem funkcji PInvoke, należy zdefiniować metodę zarządzaną reprezentującą docelową funkcję niezarządzaną. Aby zdefiniować metodę zarządzaną, należy użyć DefineMethod
z niektórymi parametrami ustawionymi na określone wartości w zależności od sposobu użycia funkcji PInvoke:
True PInvoke — obejmuje wywołanie zewnętrznej niezarządzanej metody, która znajduje się w niezarządzanej biblioteki DLL.
Lokalna funkcja PInvoke — obejmuje wywołanie natywnej metody niezarządzanej osadzonej w bieżącym module zarządzanym.
Ustawienia parametrów podano w poniższej tabeli.
Parametr | Wartości true PInvoke | Wartości dla lokalnego elementu PInvoke |
---|---|---|
dwMethodFlags |
Ustaw mdStatic ; wyczyść mdSynchronized i mdAbstract . |
|
pvSigBlob |
Prawidłowy podpis metody środowiska uruchomieniowego języka wspólnego (CLR) z parametrami, które są prawidłowymi typami zarządzanymi. | Prawidłowa sygnatura metody CLR z parametrami, które są prawidłowymi typami zarządzanymi. |
ulCodeRVA |
0 | |
dwImplFlags |
Ustaw wartości miCil i miManaged . |
Ustaw wartości miNative i miUnmanaged . |
Wymagania
Platformy: Zobacz Wymagania systemowe.
Nagłówka: Cor.h
Biblioteki: Używane jako zasób w MSCorEE.dll
wersje .NET Framework: dostępne od wersji 1.0