Поделиться через


Метод 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 родительского класса или родительского интерфейса метода. При определении глобальной функции задает для параметра td значение mdTokenNil.

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

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

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

  • cbSigBlob
    [in] Число байтов в параметре pvSigBlob.

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

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

  • pmd
    [out] Маркер члена.

Заметки

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

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

Ячейка виртуальной таблицы

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

_VtblGap<порядковыйНомер><_числоЯчеек>

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

Методы дублирования

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

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

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

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

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

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

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

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

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

Параметр

Значение для истинного PInvoke

Значение для локального PInvoke

dwMethodFlags

Необходимо установить mdStatic и снять mdSynchronized и mdAbstract.

pvSigBlob

Допустимая сигнатура метода среды CLR с параметрами, которые являются допустимыми управляемыми типами.

Допустимая сигнатура метода среды CLR с параметрами, являющимися допустимыми управляемыми типами.

ulCodeRVA

0

dwImplFlags

Следует установить miCil и miManaged.

Следует установить miNative и miUnmanaged.

Требования

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

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

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

Версии платформы .NET Framework: 4, 3.5 с пакетом обновления 1 (SP1), 3.5, 3.0 с пакетом обновления 1 (SP1), 3.0, 2.0 с пакетом обновления 1 (SP1), 2.0, 1.1, 1.0

См. также

Ссылки

Интерфейс IMetaDataEmit

Интерфейс IMetaDataEmit2