Agregar código al principio / final de los métodos en tiempo de ejecución dinámicamente

Sé que la instrumentación es una técnica para agregar código de rastreo dinámicamente en los métodos para habilitar el rastreo y la depuración.

Me preguntaba si esto es solo una opción de “Rastreo”, codificada en el CLR para agregar solo el 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 de método en una clase determinada (por ejemplo, permisos). ¿Puedo hacer esto agregando código dynamic al comienzo de los métodos en tiempo de ejecución?

No estoy seguro de cómo funciona este rastro de “instrumentación”, pero me pregunto si esto también puede usarse para otros objectives, o no.

Básicamente, lo que debe hacer es escribir un generador de perfiles CLR y usar la API del generador de perfiles en c ++
Debe implementar la interfaz ICorProfilerCallback.
Lo que está buscando está en la callback de JITComstacktionStarted. Se llama a este método cada vez que se llama a un método administrado y antes de que el comstackdor jit compile el IL en código de máquina. Cualquier trabajo de inserción de código durante el tiempo de ejecución debe realizarse en JITComstacktionStarted.
Puede ver la portada de la herramienta de cobertura de código abierto como ejemplo de cómo hacerlo.

Usted se está refiriendo a la Progtwigción Orientada a Aspectos (AOP).

Echa un vistazo a PostSharp .

También: Frameworks Orientados a Aspectos de Código Abierto en C #

Como han respondido otros, estas preocupaciones transversales a menudo se tratan con la Progtwigción Orientada a Aspectos (AOP).

Una forma de hacer AOP es con la instrumentación de código con herramientas como PostSharp, pero una alternativa que no requiere herramientas adicionales es utilizar la dependency injection (DI) y el patrón de diseño de Decorator .

Imagina que tu código consume la interfaz de IFoo:

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

Puede tener una implementación concreta MyFoo de IFoo, pero también puede escribir uno o varios Decoradores que manejen 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) envolver MyFoo en AdministratorGuardingFoo . Todos los consumidores que consumn IFoo no notarán la diferencia.

Sé que PostSharp le permite agregar ‘aspectos’ a los métodos existentes a través de la atribución para que pueda agregar trazas de entrada / salida a sus métodos

El CLR permite la interceptación de métodos a través de los receptores de mensajes