Метод 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