2010-03-17 9 views
9

Sé que la instrumentación es una técnica para agregar código de seguimiento dinámicamente en los métodos para habilitar el rastreo y la depuración.Agregando código al principio/final de los métodos en tiempo de ejecución dinámicamente

Me preguntaba si esto es solo una opción de "Rastreo", codificada en el CLR para agregar solo código de rastreo, o ¿existe la posibilidad de agregar algún código a los métodos?

Por ejemplo, quiero verificar una condición al comienzo de cada llamada a un método en una cierta clase (por ejemplo, para permisos). ¿Puedo hacer esto agregando código dinámico al comienzo de los métodos en tiempo de ejecución?

No estoy seguro de cómo funciona esta traza "instrumentación", pero me pregunto si esto también puede usarse para otros objetivos o no.

Respuesta

4

Básicamente lo que debe hacer es escribir un generador de perfiles de CLR y utilizar el profiler API en C++
Es necesario implementar la interfaz ICorProfilerCallback.
Lo que estás buscando está en la devolución de llamada JITCompilationStarted. Se llama a este método cada vez que se llama a un método gestionado y antes de que el compilador jit compile el IL en el código máquina. Cualquier trabajo de inserción de código durante el tiempo de ejecución debe hacerse en JITCompilationStarted.
Puede ver la herramienta de cobertura de código abierto part cover como ejemplo de cómo hacerlo.

0

PostSharp le permite añadir 'aspectos' a los métodos existentes a través de la atribución de lo que puede añadir la entrada/salida de traza en sus métodos

+0

Ver mi comentario sobre Mitch Wheat, por favor. – Iravanchi

3

Usted se refiere a la programación orientada a aspectos (AOP).

Eche un vistazo a PostSharp.

También: Open Source Aspect-Oriented Frameworks in C#

+0

No me refiero a AOP, pero quiero usar la instrumentación de tiempo de ejecución para AOP. Conozco algunos buenos frameworks para AOP, y he escrito uno (se publicará como código abierto pronto), y me preguntaba si puedo usar lo mismo que la instrumentación en tiempo de ejecución para interceptar llamadas. PostSharp es lo más parecido a lo que tenía en mente, pero funciona en tiempo de compilación. ¿Hay una versión en tiempo de ejecución (que en realidad agrega código al mismo método, similar a PostSharp)? – Iravanchi

2

Como otros han contestado, tales Transversal Preocupaciones con frecuencia se abordan con programación orientada a aspectos (AOP).

Una forma de hacerlo es con AOP instrumentación de código con herramientas como PostSharp, sino una alternativa que no requiere herramientas adicionales es mediante la utilización de la inyección de dependencias (DI) y el patrón de diseño Decorator.

Imagínese que su código consume la interfaz IFoo:

public interface IFoo 
{ 
    string GetStuff(string request); 
} 

usted puede tener un implmentation concreto MyFoo de IFoo, pero también se puede escribir una o varias decoradores que manejan diferentes aspectos:

public class AdministratorGuardingFoo : IFoo 
{ 
    private readonly IFoo foo; 

    public AdministratorGuardingFoo(IFoo foo) 
    { 
     if (foo == null) 
     { 
      throw new ArgumentNullException("foo"); 
     } 

     this.foo = foo; 
    } 

    public string GetStuff(string request) 
    { 
     new PrincipalPermission(null, "Administrator").Demand(); 

     return this.foo.GetStuff(request);    
    } 
} 

Ahora puede (tener su Contenedor DI) ajustar MyFoo en AdministratorGuardingFoo. Todos los consumidores que consuman IFoo no notarán la diferencia.

Cuestiones relacionadas