2009-08-26 8 views
7

Je suis curieux de savoir si .NET prend en charge toute forme d'interception dynamique d'appels de méthode (ou d'invocations de propriétés) au moment de l'exécution. Autrement dit, pouvez-vous intercepter un appel à un objet sans informations de compilation statiques telles qu'une interface (le long des lignes de CORBA DII (link text) ou IDispatch de COM). Si ce n'est pas le cas, la nouvelle fonction 'Dynamically Typed Objects' dans C# 4.0 est-elle utile à cet égard?Interception dynamique d'appels dans .NET

+0

fortement liée: http://stackoverflow.com/questions/25803/how-do-i-intercept-a-method-call-in-c –

+0

est-il étroitement lié? Je n'ai aucune classe à laquelle je peux ajouter des attributs. – karmasponge

+0

J'étudie actuellement le 'RealProxy' et le 'Bloc d'Application d'Injection de Profil'. – karmasponge

Répondre

16

Il n'y a rien d'intégré qui vous permette d'intercepter un objet dont vous ne pouvez pas contrôler l'instanciation. De même, il n'y aura pas de nouvelles installations pour cela dans le prochain .net 4.0.

Si vous pouvez contrôler instanciation:

  1. Si votre objet peut être MarshalByRef vous pouvez utiliser RealProxy.
  2. Vous pouvez utiliser un certain nombre de conteneurs IOC, par ex. LinFu, Castle Dynamic Proxy
  3. Vous pouvez utiliser un outil comme PostSharp, Mono Cecil ou Microsoft CCI de réécrire vos assemblées avec les interceptions comme une étape de post de compilation.

Si vous ne pouvez pas contrôler instanciation

  1. Vous pouvez utiliser ICorDebug - les API de débogage .Net qui sont vraiment difficiles à utiliser et lourd.
  2. Vous pouvez utiliser ICorProfiler - les API de profilage .Net sont également très compliquées à utiliser.

Sinon, vous pouvez regarder un langage dynamique comme IronRuby, qui a intégré dans la bonté alias_method et define_method (ce qui vous permet de tout redéfinissez), de sorte que l'interception cuit dans.


. NET 4.5 introduit une méthode à ReJIT méthodes qui fournit un autre crochet pour l'interception de méthode (à condition que vous n'exécutez pas un GC concurrent/bg et la méthode n'est pas inline)

+0

Vous pouvez également utiliser RealProxy si vous utilisez une interface. – kyoryu

+0

Je pense que 'Castle Dynamic Proxy' semble mieux correspondre à ce que je cherche. C'est API est gentil et simple. – karmasponge

+1

Bonnes choses. Une chose à ajouter - Mono.Cecil a des chevauchements avec PostSharp. –