Метод IMetaDataEmit::DefineMethod

Создает определение для метода или глобальной функции с указанной сигнатурой и возвращает маркер для этого определения метода.

Синтаксис

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

Параметры

td
[in] Токен mdTypedef родительского класса или родительский интерфейс метода. Задайте значение tdmdTokenNil, если вы определяете глобальную функцию.

szName
[in] Имя члена в Юникоде.

dwMethodFlags
[in] Значение перечисления CorMethodAttr , указывающее атрибуты метода или глобальной функции.

pvSigBlob
[in] Сигнатура метода. Подпись сохраняется при указании. Если необходимо указать дополнительные сведения для каких-либо параметров, используйте метод IMetaDataEmit::SetParamProps .

cbSigBlob
[in] Число байтов в pvSigBlob.

ulCodeRVA
[in] Адрес кода.

dwImplFlags
[in] Значение перечисления CorMethodImpl , указывающее признаки реализации метода .

pmd
[out] Токен участника.

Комментарии

API метаданных гарантирует сохранение методов в том же порядке, в котором вызывающий объект выдает их для заданного включающего класса или интерфейса, указанного в параметре td .

Дополнительные сведения об использовании и конкретных DefineMethod параметрах приведены ниже.

Слоты в V-таблице

Среда выполнения использует определения методов для настройки слотов виртуальных таблиц. В случае, когда необходимо пропустить один или несколько слотов, например для сохранения четности с макетом интерфейса COM, определяется фиктивный метод для использования слота или слотов в виртуальной таблице; Присвойте dwMethodFlags параметру mdRTSpecialName значение перечисления CorMethodAttr и укажите имя следующим образом:

<_VtblGapSequenceNumber><_CountOfSlots>

Где SequenceNumber — порядковый номер метода, а CountOfSlots — количество слотов, пропускаемых в виртуальной таблице. Если параметр CountOfSlots опущен, предполагается значение 1. Эти фиктивные методы нельзя вызывать из управляемого или неуправляемого кода, и любая попытка вызвать их из управляемого или неуправляемого кода создает исключение. Их единственная цель — занимать место в виртуальной таблице, которую среда выполнения создает для интеграции COM.

Повторяющиеся методы

Не следует определять повторяющиеся методы. То есть не следует вызывать DefineMethod с повторяющимся набором значений в параметрах td, wzNameи pvSig . (Эти три параметра вместе определяют метод уникальным образом.) Однако можно использовать дубликат тройной при условии, что для одного из определений метода необходимо задать mdPrivateScope бит в параметре dwMethodFlags . (Бит mdPrivateScope означает, что компилятор не будет выдавать ссылку на это определение метода.)

Сведения о реализации метода

Сведения о реализации метода часто не известны во время объявления метода. Поэтому при вызове DefineMethodне нужно передавать значения в ulCodeRVA параметры и dwImplFlags . Значения можно предоставить позже через IMetaDataEmit::SetMethodImplFlags или IMetaDataEmit::SetRVA, если это необходимо.

В некоторых ситуациях, таких как вызов платформы (PInvoke) или сценарии COM-взаимодействия, тело метода не будет предоставлено и ulCodeRVA должно иметь нулевое значение. В таких ситуациях метод не должен быть помечен как абстрактный, так как среда выполнения будет находить реализацию.

Определение метода для PInvoke

Для вызова каждой неуправляемой функции через PInvoke необходимо определить управляемый метод, представляющий целевую неуправляемую функцию. Чтобы определить управляемый метод, используйте DefineMethod для некоторых параметров определенные значения в зависимости от способа использования PInvoke:

  • True PInvoke — включает вызов внешнего неуправляемого метода, который находится в неуправляемой библиотеке DLL.

  • Local PInvoke — включает вызов собственного неуправляемого метода, внедренного в текущий управляемый модуль.

Параметры параметров приведены в следующей таблице.

Параметр Значения для true PInvoke Значения для локального PInvoke
dwMethodFlags Задайте ; mdStaticснимите mdSynchronized и mdAbstract.
pvSigBlob Допустимая сигнатура метода СРЕДЫ CLR с параметрами, которые являются допустимыми управляемыми типами. Допустимая сигнатура метода CLR с параметрами, которые являются допустимыми управляемыми типами.
ulCodeRVA 0
dwImplFlags Задайте значения для miCil и miManaged. Задайте значения для miNative и miUnmanaged.

Требования

Платформы: см. раздел Требования к системе.

Заголовка: Cor.h

Библиотека: Используется в качестве ресурса в MSCorEE.dll

версии платформа .NET Framework: доступно с версии 1.0.

См. также раздел