ICorProfilerInfo6::EnumNgenModuleMethodsInliningThisMethod, méthode
Retourne un énumérateur à toutes les méthodes qui sont définies dans un module NGen donné et qui « inlinent » une méthode donnée.
Syntaxe
HRESULT EnumNgenModuleMethodsInliningThisMethod(
[in] ModuleID inlinersModuleId,
[in] ModuleID inlineeModuleId,
[in] mdMethodDef inlineeMethodId,
[out] BOOL *incompleteData,
[out] ICorProfilerMethodEnum** ppEnum
);
Paramètres
inlinersModuleId
[in] Identificateur d’un module NGen.
inlineeModuleId
[in] Identificateur d’un module qui définit inlineeMethodId
. Pour plus d'informations, consultez la section Notes.
inlineeMethodId
[in] Identificateur d’une méthode inlined. Pour plus d'informations, consultez la section Notes.
incompleteData
[out] Indicateur qui indique si ppEnum
contient toutes les méthodes qui « inlinent » une méthode donnée. Pour plus d'informations, consultez la section Notes.
ppEnum
[out] Pointeur vers l’adresse d’un énumérateur
Notes
inlineeModuleId
et inlineeMethodId
forment ensemble l’identificateur complet de la méthode qui peut être « inlined ». Par exemple, supposons que le module A
définisse une méthode Simple.Add
:
Simple.Add(int a, int b)
{ return a + b; }
et que le module B définisse Fancy.AddTwice
:
Fancy.AddTwice(int a, int b)
{ return Simple.Add(a,b) + Simple.Add(a,b); }
Supposons également que Fancy.AddTwice
« inline » l’appel à SimpleAdd
. Un profileur peut utiliser cet énumérateur pour rechercher toutes les méthodes définies dans le module B qui « inlinent » Simple.Add
. Le résultat énumérerait AddTwice
. inlineeModuleId
est l’identificateur du module A
, et inlineeMethodId
est l’identificateur de Simple.Add(int a, int b)
.
Si incompleteData
est vrai après le retour de la fonction, c’est que l’énumérateur ne contient pas toutes les méthodes qui « inlinent » une méthode donnée. Cela peut se produire lorsqu’une ou plusieurs dépendances directes ou indirectes du module inliners n’ont pas encore été chargées. Si un profileur a besoin de données précises, il doit réessayer plus tard quand d’autres modules auront été chargés, de préférence à chaque chargement de module.
La méthode EnumNgenModuleMethodsInliningThisMethod
peut être utilisée pour contourner les limitations relatives à l’inlining pour ReJIT. ReJIT permet à un profileur de modifier l’implémentation d’une méthode, puis de créer du code pour celle-ci à la volée. Par exemple, nous pourrions modifier Simple.Add
de la façon suivante :
Simple.Add(int a, int b)
{ return 42; }
Toutefois, étant donné que Fancy.AddTwice
a déjà « inliné » Simple.Add
, il continue d’avoir le même comportement que précédemment. Pour contourner cette limitation, l’appelant doit rechercher toutes les méthodes de tous les modules qui « inlinent » Simple.Add
et utiliser ICorProfilerInfo5::RequestRejit
sur chacune de ces méthodes. Lorsque les méthodes seront recompilées, elles auront le nouveau comportement de Simple.Add
au lieu de l’ancien comportement.
Spécifications
Plateformes : Consultez Configuration requise.
En-tête : CorProf.idl, CorProf.h
Bibliothèque : CorGuids.lib
Versions de .NET Framework : disponibles depuis la version 4.6