【问题标题】:Is there a .Net analog of the functionality provided by java.lang.instrument?是否有 java.lang.instrument 提供的功能的 .Net 模拟?
【发布时间】:2009-07-02 03:19:51
【问题描述】:

我研究了一些著名的面向 AOP 的 .Net 框架,例如 Microsoft 的 PostSharp、bltoolkit、Castle、Cecil 和 Policy Injection Block。也许我很无知,但似乎这些框架不提供在虚拟机加载类时注入代码的能力,在应用程序可见之前。它们似乎都依赖于应用程序对工厂的使用或类/方法级别的属性,这些属性提供了编译时操作程序集所需的元数据。我正在寻找的java.lang.instrument 的关键特性是在方法调用周围简单地注入拦截器,而无需更改源(方法/类的属性)或重建现有程序集以注入拦截代码。

【问题讨论】:

    标签: .net aop instrumentation


    【解决方案1】:

    您说得对,大多数 .NET 的 AOP 框架都要求您使用特殊类型的工厂等创建对象。原因是 .NET 中的(自定义)属性是被动的,因此您需要某种可以及时检查这些属性的框架。

    有一些 .NET 的 AOP 框架使用代码生成或 IL 编织(在正常编译后修改中间语言字节码)来允许拦截,但我总是远离这样的事情 - 有很多这种方法的固有问题。

    我曾经有机会问 Anders Hejlsberg,我们是否不能在 .NET 中获得“活动”属性,但他的回答是,如果微软提供这样的能力,他们还不如停止该平台的所有进一步开发,因为如果不破坏与某人代码的兼容性,就不可能推动 .NET 向前发展(我可能歪曲了他的回答,但重要的部分是它已被考虑并拒绝 - 显然是有充分理由的)。

    也就是说,.NET 有一个可以拦截任何方法调用的 Instrumentation API。然而,该 API 是一个非托管 API(它要求您编写非托管 C++ 代码)并且 (IIRC) 要求您自己托管 .NET 应用程序。这是一种非常严厉的方法。您还应该意识到 Instrumentation 可能会损害您的应用程序的性能。

    【讨论】:

    • 我希望避免使用非托管 API。感谢您提供有趣的信息!
    【解决方案2】:

    你看过这篇文章吗:comparing IoC frameworks

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多