Método ICorProfilerInfo6::EnumNgenModuleMethodsInliningThisMethod
Este método puede usarse para obtener un enumerador que incluya todos los métodos que se definan en el módulo NGen que se especifique e insertar el método que se especifique.
Sintaxis
HRESULT EnumNgenModuleMethodsInliningThisMethod(
[in] ModuleID inlinersModuleId,
[in] ModuleID inlineeModuleId,
[in] mdMethodDef inlineeMethodId,
[out] BOOL *incompleteData,
[out] ICorProfilerMethodEnum** ppEnum
);
Parámetros
inlinersModuleId
[in] El valor de este parámetro se corresponde con el identificador de un módulo NGen.
inlineeModuleId
[in] El valor de este parámetro se corresponde con el identificador del módulo donde se define el valor del parámetro inlineeMethodId
. Vea la sección Comentarios para obtener más información.
inlineeMethodId
[in] El valor de este parámetro se corresponde con el identificador de un método insertado. Vea la sección Comentarios para obtener más información.
incompleteData
[out] El valor de este parámetro se corresponde con una marca donde se indica si el enumerador del parámetro ppEnum
incluye todos los métodos que insertan un método determinado. Vea la sección Comentarios para obtener más información.
ppEnum
[out] El valor de este parámetro se corresponde con un puntero que apunta a la dirección de un enumerador.
Observaciones
Para obtener el identificador completo del método que puede estar insertado, se combinan los valores de los parámetros inlineeModuleId
y inlineeMethodId
. Por ejemplo, supongamos que en el módulo A
se define el método Simple.Add
, de la siguiente manera:
Simple.Add(int a, int b)
{ return a + b; }
Además, supongamos que en el módulo B se define el método Fancy.AddTwice
, de la siguiente manera:
Fancy.AddTwice(int a, int b)
{ return Simple.Add(a,b) + Simple.Add(a,b); }
Supongamos también que, en el método Fancy.AddTwice
, se inserta la llamada al método SimpleAdd
. Este enumerador podría usarse con un generador de perfiles para buscar todos los métodos que se definan en el módulo B en los que se incluya el método Simple.Add
; en el resultado, se enumeraría el método AddTwice
. El valor del parámetro inlineeModuleId
será el identificador del módulo A
y el valor del parámetro inlineeMethodId
será el identificador del método Simple.Add(int a, int b)
.
Si el valor del parámetro incompleteData
es true cuando se devuelva la función, significará que el enumerador no contiene todos los métodos en los que se inserta un método determinado. Esto puede ocurrir si todavía no se han cargado una o varias de las dependencias directas o indirectas del módulo donde se produce la inserción. Si un generador de perfiles necesita datos precisos, deberá reintentarlo cuando se hayan cargado más módulos, preferiblemente tras el proceso de carga de cada módulo.
El método EnumNgenModuleMethodsInliningThisMethod
se puede usar para solucionar las limitaciones de inserción de ReJIT. En ReJIT, se permite el uso de un generador de perfiles para cambiar la implementación de un método y, a continuación, crear código nuevo para este sobre la marcha. Por ejemplo, el método Simple.Add
se podría cambiar de la siguiente manera:
Simple.Add(int a, int b)
{ return 42; }
Sin embargo, dado que en el método Fancy.AddTwice
ya se ha insertado el método Simple.Add
, este seguirá teniendo el mismo comportamiento que antes. Para solucionar esta limitación, el llamador deberá buscar todos los métodos de todos los módulos en los que se inserte el método Simple.Add
y deberá usar el método ICorProfilerInfo5::RequestRejit
en cada uno de esos métodos. Cuando los métodos se vuelvan a compilar, estos tendrán el nuevo comportamiento del método Simple.Add
en lugar del anterior.
Requisitos
Plataformas: Vea Requisitos de sistema.
Encabezado: CorProf.idl, CorProf.h
Biblioteca: CorGuids.lib
Versiones de .NET Framework: está disponible desde la versión 4.6