.NET Profiler API es la forma más cercana "aprobada por Microsoft" de interceptar métodos en tiempo de ejecución. Como ya se mencionó, esto es algo difícil de implementar y no conozco una biblioteca que lo haga fácil de implementar usando un código puramente administrado.
Al investigar las opciones para este yo hace unos meses, tropecé con CLR Method Injection, que es un artículo con código fuente que explica cómo interceptar métodos en tiempo de ejecución. Consideré usarlo yo mismo, e incluso tuve el proyecto de muestra funcionando, pero finalmente concluí que necesitaba algo más que la interceptación del método y necesitaría una solución diferente. Sin embargo, este enfoque responde directamente a su pregunta.
Por último, lo que terminó haciendo fue desarrollar Afterthought como una alternativa de código abierto a PostSharp, que se ejecuta como un paso posterior a la compilación y le permite modificar los métodos existentes para llamar a otro código, o reemplazar las implementaciones de métodos por completo. Estoy trabajando ahora en una nueva sintaxis fluida, que voy a incluir una muestra de ahora para proporcionar un ejemplo para ayudarle a ver cómo este enfoque AOP podría satisfacer sus necesidades:
Methods
.Named("Sum")
.WithParams<int[]>()
.Before((T instance, ref int[] values)
=> { var s = new Stopwatch(); s.Start(); return s; })
.After((instance, stopwatch, values)
=> instance.Result = (int)stopwatch.ElapsedMilliseconds);
En este caso, mientras se modifica una ya existente escriba con un método Sum
Estoy introduciendo código antes y después del método para medir el tiempo de ejecución. Después de ejecutar Afterthought contra la clase compilada original, el método Sum resultante tendría llamadas a estas expresiones lambda (el compilador de C# simplemente las convierte en métodos estáticos) antes y después del cuerpo del método. Podría haber llamado Implement
y haber reemplazado toda la implementación del método.
Espero que uno de estos enfoques satisfaga sus necesidades. En mi caso, fui a la ruta AOP porque quería hacer algo más que interceptar, como implementar interfaces, agregar nuevos métodos/propiedades, etc. También quería algo que no introdujera dependencias en el tiempo de ejecución o preocupaciones sobre la estabilidad o el rendimiento en el entorno de tiempo de ejecución: el procesamiento en tiempo de compilación es más seguro y más fácil de probar.
la pregunta es bastante interesante. pero no creo que haya una manera ... –