2009-08-26 13 views
7

Sono curioso di sapere se .NET supporta qualsiasi forma di intercettazione dinamica delle chiamate di metodo (o invocazioni di proprietà) in fase di esecuzione. Cioè, puoi intercettare una chiamata a un oggetto senza informazioni di compilazione statiche come un'interfaccia (lungo le linee del DIBA CORBA (link text) o dell'IDispatch di COM).Intercettazione dinamica delle chiamate in .NET

In caso contrario, la nuova funzione "Oggetti dinamicamente tipizzati" in C# 4.0 può essere d'aiuto in questo senso.

+0

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

+0

E 'fortemente legato? Non ho classi a cui aggiungere attributi. – karmasponge

+0

Attualmente sto studiando il 'RealProxy' e il 'Profile Injection Application Block'. – karmasponge

risposta

16

Non c'è niente di integrato che ti permetta di intercettare un oggetto di cui non puoi controllare l'istanza. Allo stesso modo, non ci saranno nuove strutture per questo nel prossimo 4.0.

Se è possibile controllare esemplificazione:

  1. Se l'oggetto può essere MarshalByRefObject è possibile utilizzare RealProxy.
  2. È possibile utilizzare diversi contenitori IOC, ad es. LinFu, Castle Dynamic Proxy
  3. È possibile utilizzare uno strumento come PostSharp, Mono Cecil o Microsoft CCI di riscrivere gli assembly con le intercettazioni come una fase di post di compilazione.

Se non è possibile controllare esemplificazione

  1. È possibile utilizzare ICorDebug - il Net debug API che sono davvero difficili da usare e pesante.
  2. È possibile utilizzare ICorProfiler - le API di profilo .Net, dove sono anche piuttosto complicate da usare.

In alternativa, si potrebbe guardare un linguaggio dinamico come IronRuby, che ha un built-in alias_method e define_method bontà (che permette di ridefinire nulla), in modo da intercettazioni cotto in.


. NET 4.5 sta introducendo un metodo per i metodi ReJIT che fornisce un altro hook per l'intercettazione del metodo (a condizione che tu non stia eseguendo un GC concorrente/bg e il metodo non sia delineato)

+0

È possibile utilizzare RealProxy anche se si sta utilizzando un'interfaccia. – kyoryu

+0

Penso che "Castle Dynamic Proxy" sembra adattarsi al meglio a quello che sto cercando. La sua API è bella e semplice. – karmasponge

+1

Roba buona. Una cosa da aggiungere - Mono.Cecil ha alcune sovrapposizioni con PostSharp. –

Problemi correlati