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


Метод ICorProfilerInfo6::EnumNgenModuleMethodsInliningThisMethod

Возвращает перечислитель для всех методов, определенных в заданном модуле NGen и встроенных в данный метод.

Синтаксис

HRESULT EnumNgenModuleMethodsInliningThisMethod(
        [in] ModuleID inlinersModuleId,
        [in] ModuleID inlineeModuleId,
        [in] mdMethodDef inlineeMethodId,
        [out] BOOL *incompleteData,
        [out] ICorProfilerMethodEnum** ppEnum
);

Параметры

inlinersModuleId
[in] Идентификатор модуля NGen.

inlineeModuleId
[in] Идентификатор модуля, определяющего inlineeMethodId. Дополнительные сведения см. в разделе "Примечания".

inlineeMethodId
[in] Идентификатор встроенного метода. Дополнительные сведения см. в разделе "Примечания".

incompleteData
[out] Флаг, указывающий, содержит ли ppEnum все методы, встроенные в данный метод. Дополнительные сведения см. в разделе "Примечания".

ppEnum
[out] Указатель на адрес перечислителя

Комментарии

inlineeModuleId и inlineeMethodId вместе образуют полный идентификатор метода, который может быть вложен. Например, предположим, что модуль A определяет метод Simple.Add:

Simple.Add(int a, int b)
{ return a + b; }

и модуль B определяет Fancy.AddTwice:

Fancy.AddTwice(int a, int b)
{ return Simple.Add(a,b) + Simple.Add(a,b); }

Давайте также предположим, что Fancy.AddTwice встраивает вызов .SimpleAdd Профилировщик может использовать этот перечислитель для поиска всех методов, определенных в модуле B, которые встроили Simple.Add, и результат перечислил AddTwice. inlineeModuleId— это идентификатор модуля A, а inlineeMethodId — идентификатор .Simple.Add(int a, int b)

Если incompleteData имеет значение true после возврата функции, перечислитель не содержит все методы, встраивающиеся в данный метод. Это может произойти, если одна или несколько прямых или косвенных зависимостей модуля inliners еще не загружены. Если профилировщику требуются точные данные, он должен повторить попытку позже при загрузке дополнительных модулей, предпочтительно при каждой загрузке модуля.

Метод EnumNgenModuleMethodsInliningThisMethod можно использовать для обхода ограничений на встраивание для ReJIT. ReJIT позволяет профилировщику изменять реализацию метода, а затем создавать для него новый код в режиме реального времени. Например, можно изменить Simple.Add следующим образом:

Simple.Add(int a, int b)
{ return 42; }

Однако, поскольку Fancy.AddTwice уже встраивалась Simple.Add, он по-прежнему имеет то же поведение, что и раньше. Чтобы обойти это ограничение, вызывающий объект должен искать все методы во всех модулях, которые встроенные Simple.Add и используются ICorProfilerInfo5::RequestRejit в каждом из этих методов. При повторной компиляции методов они будут иметь новое поведение Simple.Add вместо старого.

Требования

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

Заголовок: CorProf.idl, CorProf.h

Библиотека: CorGuids.lib

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

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