2010-05-17 10 views

Respuesta

6

Esto es similar en espíritu a ICorProfilerCallback::JITCompilationStarted cuando se combina con ICorProfilerInfo::SetILFunctionBody, pero con más restricciones. Las clases ICorProfiler* se pueden usar para hacer instrumentación en tiempo de ejecución para casi cualquier método administrado. Hay perfiladores y depuradores que los utilizan para recopilar información sobre un proceso en ejecución.

Puede usar MethodRental para el código del instrumento con fines de diagnóstico. Algunos ejemplos:

  • La función entrar/salir le daría un seguimiento de ejecución que podría usar para derivar datos de creación de perfiles.
  • La instrumentación de primitivas de sincronización puede ayudarlo a diagnosticar las condiciones de carrera.
  • La instrumentación de bloques básicos puede ayudarlo a determinar la cobertura del código.

También puede usar MethodRental para mejorar la funcionalidad del código existente. Aspect-oriented programming viene a la mente. Podría 'tejer' en seguridad, registro u otras preocupaciones de diseño transversales en el código existente. Sin embargo, esto requeriría algún otro recurso (XML, una biblioteca de C#) para expresar sus aspectos.

Finalmente, podría usar MethodRental para "desviar" el código existente, es decir, las llamadas al método de interceptación para crear un tipo de polimorfismo de tiempo de ejecución. Por ejemplo, si tiene un código de cliente que usa alguna clase generada dinámicamente RegistryStore para obtener alguna configuración a través de GetConfig, puede reescribir el IL del método para cambiar la implementación de RegistryStore.GetConfig para usar el sistema de archivos en su lugar. Puede hacer esto sin tener que cambiar el código del cliente.

+0

No se puede usar MethodRental para AOP ya que solo admite métodos dinámicos, ¿o sí? – Giorgi

+1

@Giorgi: lo siento, no quise ser engañoso. Puede usarlo para AOP, pero seguirá teniendo las mismas limitaciones que 'MethodRental' impone: específicamente, que solo puede usarlo en métodos/conjuntos dinámicos. Dependiendo de lo que trates de hacer, puede que no sea útil en absoluto. Sin embargo, todos los usos que enumeré tienen la misma restricción fundamental. –

+0

Gracias por su respuesta. Como la restricción es muy limitada, es porque no podía pensar en un posible uso. – Giorgi

6

No estoy seguro de a qué limitaciones se refiere. Claramente, esto solo puede funcionar en métodos generados dinámicamente, producidos por MethodBuilder. Los métodos de clase compilados JIT desde IL cargados desde un ensamblaje no pueden ser reemplazados.

Un caso de uso implementaría un tiempo de ejecución para un lenguaje dinámico que admite la modificación de los métodos de las clases ya definidas (parche de mono). Idiomas como Ruby, Python, Javascript, etc.

Cuestiones relacionadas