动态拦截.NET中的调用

时间:2009-08-26 01:05:34

标签: c# .net reflection dynamic

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

如果没有,C#4.0中新的“动态类型对象”功能是否有助于此。

3 个答案:

答案 0 :(得分:17)

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

如果你可以控制实例化:

  1. 如果您的对象可以是MarshalByRef,则可以使用RealProxy
  2. 您可以使用相当多的IOC容器,例如。 LinFuCastle Dynamic Proxy
  3. 您可以使用PostSharpMono CecilMicrosoft CCI之类的工具来重写您的程序集,并将拦截作为后编译步骤。
  4. 如果你无法控制实例化

    1. 您可以使用ICorDebug - .Net调试API,这些API非常难以使用且非常重。
    2. 您可以使用ICorProfiler - .Net配置文件API也很复杂。
    3. 或者,您可以查看一个像IronRuby这样的动态语言,它具有内置的alias_methoddefine_method优点(允许您重新定义任何内容),因此可以进行拦截。


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

答案 1 :(得分:2)

答案 2 :(得分:1)

查看.net 4.0动态对象......这可以做到。

http://www.ontheblog.net/CMS/Home/tabid/36/EntryID/77/Default.aspx