2009-08-26 13 views
7

Tengo curiosidad por saber si .NET admite cualquier forma de interceptación dinámica de llamadas a métodos (o invocaciones de propiedades) en tiempo de ejecución. Es decir, ¿puede interceptar una llamada a un objeto sin información de compilación estática, como una interfaz (a lo largo de las líneas de CORBA DII (link text) o IDispatch de COM).Intercepción dinámica de llamadas en .NET

Si no, la nueva característica 'Objetos de tipo dinámico' en C# 4.0 ayuda en este sentido.

+0

fuertemente relacionada: http://stackoverflow.com/questions/25803/how-do-i-intercept-a-method-call-in-c –

+0

¿Está fuertemente relacionado? No tengo ninguna clase a la que pueda agregarle atributos. – karmasponge

+0

Actualmente estoy investigando el 'RealProxy' y el 'Bloque de aplicaciones de inyección de perfiles'. – karmasponge

Respuesta

16

No hay nada incorporado que le permita interceptar un objeto que no puede controlar la creación de instancias. Del mismo modo, no habrá nuevas instalaciones para esto en el próximo .NET 4.0.

Si usted puede controlar de instancias:

  1. Si su objeto puede ser MarshalByRef puede utilizar RealProxy.
  2. Puede usar bastantes contenedores de COI, p. Ej. LinFu, Castle Dynamic Proxy
  3. se puede utilizar una herramienta como PostSharp, Mono Cecil o Microsoft CCI a reescribir sus asambleas con las intercepciones como un paso posterior a la compilación.

Si no puede controlar instanciación

  1. Puede utilizar ICorDebug - la depuración .Net API que son muy difíciles de usar y pesado.
  2. Puede usar ICorProfiler - las API de perfilado .Net, que también son bastante complicadas de usar.

Alternativamente, usted podría mirar a un lenguaje dinámico como IronRuby, que tiene un built-in alias_method y define_method bondad (que le permite redefinir nada), por lo que la interceptación cuece en.


. NET 4.5 está introduciendo un método para los métodos ReJIT que proporciona otro enlace para la interceptación del método (siempre que no esté ejecutando un GC concurrente/bg y el método no esté en línea)

+0

Puede usar RealProxy si también está pasando por una interfaz. – kyoryu

+0

Creo que 'Castle Dynamic Proxy' parece ajustarse mejor a lo que estoy buscando. Su API es agradable y simple. – karmasponge

+1

cosas buenas. Una cosa para agregar: Mono.Cecil tiene algunas superposiciones con PostSharp. –

Cuestiones relacionadas