拦截方法调用

时间:2014-08-18 14:54:29

标签: c# reflection interception

有没有一种方法可以拦截一些方法调用,而不会在方法本身周围进行任何代码更改?

我不需要在运行时注入任何自定义行为,只需将自定义性能日志记录添加到现有项目中。

6 个答案:

答案 0 :(得分:14)

您需要面向方面编程。

AOP有4种主要风味

  1. 基于AOP的运行时RealProxy
  2. 运行时子类/虚方法AOP
  3. Post Compile IL编织AOP
  4. 预编译源代码AOP
  5. 以上是按执行速度(从最慢到最快)的顺序排序。注意最后两个"应该"速度相同。但是我希望编译器比Post Compile IL编织产生更好的IL。

    第一阵营通常包括IOC容器,因为它们非常适合这种模式,包括但不限于

    • 统一
    • Spring.NET
    • Castle.Windsor
    • Postsharp Express

    第二个阵营非常罕见,我能想到的唯一一个项目是实体框架(它用于延迟加载,但它不可扩展,无法定制) )。

    第三阵营也非常敏锐,因为这种技术非常复杂和困难。这可以通过在编译后编辑dll程序集来实现,以添加所需的额外代码。

    • Postsharp Pro
    • Mono.Cecil能做到
    • Fody(mono.cecil wrapper)

    最后的阵营相对较新。事实上,新的唯一真正的入口是实验性的MS Roslyn。这实际上是一个C#编译器。所以...是的......它非常神奇。

    现在,如果您遇到性能关键代码的真正巨大性能问题,我建议使用Fody。令人敬畏的是,它是免费的(与Postsharp Pro不同),它使用nuget和there is already a performance tool in Fody.MethodTimer

答案 1 :(得分:3)

答案 2 :(得分:3)

您可以在方法执行之前或之后使用任何AOP框架(如Spring .NETUnity)来拦截调用。 因此,您无需更改方法代码。

答案 3 :(得分:3)

我已成功使用Castle DynamicProxy。它比完整的AOP框架更轻量级,并且可以在没有IoC容器的情况下使用。

答案 4 :(得分:2)

使用PostSharp

[Serializable]
public class LogPerformance : OnMethodBoundaryAspect
{
    [NonSerialized]
    Stopwatch _stopWatch;

    public override void OnEntry(MethodExecutionArgs args)
    {
        _stopWatch = Stopwatch.StartNew();
        base.OnEntry(args);
    }

    public override void OnExit(PostSharp.Aspects.MethodExecutionArgs args)
    {
        Console.WriteLine(string.Format("[{0}] took {1} ms to execute",
          new StackTrace().GetFrame(1).GetMethod().Name,
            _StopWatch.ElapsedMilliseconds));
        base.OnExit(args);
    }
}

在功能上使用这样的方面:

[LogPerformance]
static void LongRunningCalc()
{
    //Your Code goes here
}

简化自:http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

答案 5 :(得分:1)

你在寻找的是Fody:https://github.com/fody

它的开源,稳定,并有很多插件用于不同的AOP用例。 我在一个巨大的商业应用程序中使用它,它运行得很好。 安装和配置非常简单,只需几分钟即可通过nuget完成。

一些示例插件是:

  • PropertyChanged :(在编译时将INotifyPropertyChanged代码注入属性)
  • Anotar(简化通过静态类和一些IL操作的日志记录)
  • Method Timer(注入一些非常基本的方法时序代码)
  • ......还有更多!

要求,示例和文档可以在fodys github pages上找到。

相关问题