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] 指向枚举器地址的指针

注解

inlineeModuleIdinlineeMethodId 共同构成了可能内联的方法的完整标识符。 例如,假设模块 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 的方法,结果将枚举 AddTwiceinlineeModuleId 是模块 A 的标识符,inlineeMethodIdSimple.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 及更高版本

另请参阅