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