Метод 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
параметрах приведены ниже.
Слоты в 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.