Udostępnij za pośrednictwem


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, wzNamei 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

Zobacz też