动态拦截.NET中的调用

kar*_*nge 8 .net c# reflection dynamic

我很想知道.NET是否支持在运行时对方法调用(或属性调用)进行任何形式的动态拦截.也就是说,您是否可以在没有静态编译信息(如接口(沿着CORBA DII(链接文本)或COM的IDispatch的行)的情况下拦截对象的调用.

如果没有,C#4.0中新的"动态类型对象"功能是否会在这方面有所帮助.

Sam*_*ron 17

没有任何内置功能可以拦截您无法控制实例化的对象.同样,在即将推出的.net 4.0中也没有新设施.

如果你可以控制实例化:

  1. 如果您的对象可以是MarshalByRef,则可以使用RealProxy.
  2. 您可以使用相当多的IOC容器,例如.LinFu,城堡动态代理
  3. 您可以使用PostSharp,Mono CecilMicrosoft CCI等工具来重写您的程序集,并将拦截作为后编译步骤.

如果你无法控制实例化

  1. 您可以使用ICorDebug - .Net调试API,它们真的很难使用且很重.
  2. 您可以使用ICorProfiler - .Net配置文件API也很复杂.

或者,您可以查看一个像IronRuby这样的动态语言,它具有内置alias_methoddefine_method良好(允许您重新定义任何内容),因此可以进行拦截.


.NET 4.5为ReJIT方法引入了一个方法,它为方法拦截提供了另一个钩子(前提是你没有运行并发/ bg GC,并且该方法没有内联)