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,则枚举器不包含内联给定方法的所有方法。 当尚未加载内联模块的一个或多个直接或间接依赖项时,可能会发生这种情况。 如果探查器需要准确的数据,它应该稍后在加载更多模块时重试,最好在每个模块加载时重试。
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 及更高版本