Generar perfiles en .NET Framework 2.0
La API de generación de perfiles se mejoró en la versión 2.0 de .NET Framework para proporcionar funciones adicionales. La nueva funcionalidad se expone a través de dos nuevas interfaces: ICorProfilerCallback2 e ICorProfilerInfo2.
Una DLL del generador de perfiles escrita para la versión 1.0 o 1.1 de .NET Framework no funcionará correctamente en el entorno Common Language Runtime (CLR) de .NET Framework 2.0. Para actualizar la DLL del generador de perfiles de manera que funcione con la versión 2.0 o posterior, debe implementar la interfaz ICorProfilerCallback2. La interfaz ICorProfilerInfo2 hereda de la interfaz ICorProfilerInfo e introduce nuevos métodos que admiten la interacción mejorada con CLR.
Los cambios se tratan en las siguientes secciones:
Genéricos
División del código
Eliminación de la depuración en proceso
Devoluciones de llamada con el generador de imágenes nativas
Devoluciones de llamada de recolección de elementos no utilizados mejoradas
Objects inmovilizados
Cambios diversos en la API
Además de los cambios realizados en la API, se agregó un nuevo HRESULT, CORPROF_E_UNSUPPORTED_CALL_SEQUENCE. Para obtener información sobre los escenarios en los que puede devolverse este HRESULT, vea CORPROF_E_UNSUPPORTED_CALL_SEQUENCE (HRESULT).
Genéricos
La introducción de genéricos en el motor en tiempo de ejecución ha producido tres cambios en la API de generación de perfiles:
Ya no existe una asignación unívoca entre los tokens typedef y los valores ClassID, o entre los tokens MethodDef y los valores FunctionID. Esto se debe a que es posible crear instancias de cada clase o función para varios tipos diferentes. Los autores del generador de perfiles deben leer Identificadores para notificaciones en tiempo de ejecución y generación de perfiles, examinar cómo utilizan los métodos ICorProfilerInfo::GetClassFromToken e ICorProfilerInfo::GetFunctionFromToken en el código y reescribir el código de modo que admita genéricos. La API de generación de perfiles proporciona dos nuevos métodos, ICorProfilerInfo2::GetClassFromTokenAndTypeArgs e ICorProfilerInfo2::GetFunctionFromTokenAndTypeArgs, para admitir genéricos.
Ya no existe una asignación directa entre un FunctionID y el ClassID que contiene. Optimización del uso compartido del código puede permitir que diferentes instancias de un tipo genérico compartan código. Solamente se puede determinar el ClassID de un FunctionID al examinarlos en el contexto de una activación determinada de la función.
Los métodos de información de clase y función existentes en la interfaz ICorProfilerInfo no proporcionan información sobre argumentos de tipo para tipos y funciones genéricos. Para este propósito se proporcionan los métodos ICorProfilerInfo2::GetClassIDInfo2 e ICorProfilerInfo2::GetFunctionInfo2. Tenga en cuenta que estos métodos no siempre pueden proporcionar esta información; vea Identificadores para notificaciones en tiempo de ejecución y generación de perfiles para obtener más información.
Volver al principio
División del código
Los ensamblados de .NET Framework se han sometido a una optimización de rendimiento. El código nativo precompilado se ha dividido en varias regiones por función. Por consiguiente, el método ICorProfilerInfo::GetCodeInfo existente ya no puede describir correctamente la extensión del código nativo de una función. Los generadores de perfiles deben pasar a usar en su lugar el método ICorProfilerInfo2::GetCodeInfo2, más general.
Volver al principio
Eliminación de la depuración en proceso
En .NET Framework 2.0, la depuración en proceso se ha reemplazado por un conjunto de funciones coherente con la API de generación de perfiles. El resultado son las características de instantánea de pila (vea Información general sobre la generación de perfiles) e inspección de objetos.
Volver al principio
Devoluciones de llamada con el generador de imágenes nativas
Significativas optimizaciones en el Generador de imágenes nativas (NGen.exe) han movido aun más trabajo del tiempo de ejecución al tiempo de generación de imágenes nativas. Esto ha conducido a los cambios siguientes en el comportamiento de la API de generación de perfiles:
Para la mayoría de las funciones, las devoluciones de llamada JITCachedFunctionSearch no se reciben ya en imágenes nativas. Un generador de perfiles tiene dos opciones que dependen de cómo utiliza las devoluciones de llamada:
Si el generador de perfiles utiliza las devoluciones de llamada para recopilar información sobre una función, puede cambiar a un esquema donde solamente se recopila información sobre una función determinada cuando esa función se encuentra por primera vez durante la ejecución de un programa.
Si el generador de perfiles utiliza las devoluciones de llamada para forzar una compilación Just-In-Time (JIT) para propósitos de instrumental, puede utilizar en su lugar imágenes nativas mejoradas por el generador de perfiles. Para obtener más información, vea Generación de código en la API de generación de perfiles.
Para la mayoría de los tipos, las devoluciones de llamada ClassLoad no se reciben ya en imágenes nativas. Los generadores de perfiles deben utilizar técnicas de evaluación en tiempo de ejecución (también llamada evaluación laxa) para tales clases. Los generadores de perfiles que ya estén utilizando imágenes nativas mejoradas por generador de perfiles no tienen que cambiar su comportamiento. Sin embargo, un generador de perfiles no debe cambiar a imágenes nativas mejoradas por generador de perfiles a menos que necesite estas imágenes por otras razones, dado que las imágenes nativas mejoradas por generador de perfiles son significativamente diferentes de las imágenes normales.
Volver al principio
Devoluciones de llamada de recolección de elementos no utilizados mejoradas
Las devoluciones de llamada de recolección de elementos no utilizados se han mejorado de varias maneras. Las devoluciones de llamada notifican ahora al generador de perfiles que se han creado o destruido identificadores de recolección de elementos no utilizados, proporcionan información sobre la puesta en cola de objetos por finalizar y utilizan el método Collect para forzar una recolección de elementos no utilizados. El método de ICorProfilerCallback2::RootReferences2, que es una extensión de ICorProfilerCallback::RootReferences, proporciona información sobre el tipo de cada raíz. Finalmente, el método de ICorProfilerCallback2::SurvivingReferences informa del diseño de objetos del montón producido por una recolección de elementos no utilizados sin compactación.
Volver al principio
Objects inmovilizados
Los objetos inmovilizados, que son nuevos en .NET Framework 2.0, son objetos constantes que se inicializan en el momento de la generación de imagen nativa y se graban en la imagen nativa. La recolección de elementos no utilizados no reubica los objetos inmovilizados, pero los objetos de recolección de elementos no utilizados pueden hacer referencia a objeto inmovilizados. El nuevo método ICorProfilerInfo2::EnumModuleFrozenObjects permite a los generadores de perfiles enumerar objetos inmovilizados.
Volver al principio
Cambios diversos en la API
.NET Framework 2.0 también incluye los siguientes cambios en la API:
El método ICorProfilerInfo::SetFunctionReJIT devuelve ahora E_NOIMPL. En versiones anteriores, la llamada a este método producía interbloqueos.
El nuevo método ICorProfilerCallback2::ThreadNameChanged proporciona notificaciones de cambios de nombres de subproceso.
El nuevo método ICorProfilerInfo2::GetThreadAppDomain acepta un Identificador de subproceso y devuelve el dominio de aplicación en el que se está ejecutando ese subproceso.
Volver al principio