为给定 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 及更高版本