【问题标题】:Dynamic interception of calls in .NET [closed].NET中调用的动态拦截[关闭]
【发布时间】:2010-11-22 20:14:08
【问题描述】:

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

如果没有,C# 4.0 中新的“动态类型对象”功能会在这方面有所帮助吗?

【问题讨论】:

  • 是强相关吗?我没有可以添加属性的类。
  • 我目前正在调查“RealProxy”和“Profile Injection Application Block”。
  • 实际上,我的意思是“城堡动态代理”(而不是“RealProxy”),因为到目前为止,它看起来就是我正在寻找的东西。
  • @karma,.net 中用于 AOP 的相同底层机制倾向于用于方法拦截...

标签: c# .net reflection dynamic


【解决方案1】:

没有任何内置功能可以让您拦截您无法控制实例化的对象。同样,在即将到来的 .net 4.0 中也不会为此提供新功能。

如果你可以控制实例化:

  1. 如果您的对象可以是 MarshalByRef,您可以使用 RealProxy
  2. 您可以使用很多 IOC 容器,例如。 LinFu, Castle Dynamic Proxy
  3. 您可以使用PostSharpMono CecilMicrosoft CCI 之类的工具在编译后步骤中使用拦截来重写您的程序集。

如果你无法控制实例化

  1. 您可以使用ICorDebug - .Net 调试 API,非常难用而且很重。
  2. 您可以使用 ICorProfiler - .Net 分析 API,使用起来也相当复杂。

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


在 .NET 4.5 中,前面提到的 ICorProfilerReJIT 方法引入了一个方法,该方法为方法拦截提供了另一个钩子(前提是您没有运行并发/bg GC 并且该方法未内联)。

【讨论】:

  • 如果您要通过接口,也可以使用 RealProxy。
  • 我认为“城堡动态代理”似乎最适合我正在寻找的内容。它的 API 很好而且很简单。
  • 好东西。要添加的一件事 - Mono.Cecil 与 PostSharp 有一些重叠。
猜你喜欢
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多