拦截方法调用

本文关键字:调用 方法 | 更新日期: 2023-09-27 18:18:43

是否有一种方法可以拦截一些方法调用,而不需要对方法本身进行任何代码更改?

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

拦截方法调用

你想要面向方面编程

有四种主要的AOP风格

    基于AOP的运行时RealProxy
  1. 运行时子类/虚方法AOP
  2. 后编译将编织AOP
  3. 预编译源代码AOP

以上是按照执行速度(从最慢到最快)排序的。注意最后两个"应该"是相同的速度。然而,我希望编译器产生的IL比编译后的IL编织更好。

第一个阵营通常包括IOC容器,因为它们非常适合这种模式,包括但不限于
    统一
  • 春天。净
  • 城堡。温莎
  • Postsharp表达

第二个阵营,是相当罕见的,我能想到的唯一的项目是实体框架(它使用它来延迟加载,但它是不可扩展的,不能自定义)。

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

  • Postsharp Pro
  • Mono。塞西尔
  • Fody(单声道)塞西尔包装)

最后一个阵营相对较新。这么新,事实上,唯一真正进入的是实验性的MS Roslyn。这实际上是一个c#编译器。所以…是的…真神奇。

现在,如果您在性能关键代码中遇到真正巨大的性能问题,我建议使用Fody。最棒的是,它是免费的(不像Postsharp Pro),它使用nuget,并且在Fody.MethodTimer中已经有一个性能工具。

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

你可以看看面向方面编程,看看它是否适合你的情况。

例如

:http://docs.castleproject.org/Default.aspx?Page=Introduction-to-AOP-With-Castle& NS = Windsor& AspxAutoDetectCookieSupport = 1

http://fgheysels.blogspot.be/2006/11/aspect-oriented-programming-in-net.html

你可以使用任何AOP框架,比如Spring . net或Unity,在方法执行之前或之后拦截调用。因此,您不需要更改方法代码。

您要找的是Fody: https://github.com/fody

它是开源的,稳定的,并且为不同的AOP用例提供了许多插件。我在一个巨大的商业应用中使用它,它工作得非常好。安装和配置是超级容易,并在几分钟内通过nuget完成。

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

需求,示例和文档可以在fodys github页面找到。

使用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);
    }
}

在函数中使用aspect:

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

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