拦截方法调用

有没有办法拦截一些方法调用而不对方法本身进行任何代码更改?

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

您需要面向方面编程。

AOP有4种主要口味

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

以上是按执行速度(从最慢到最快)的顺序排序。 注意最后两个“应该”是相同的速度。 但是我希望编译器比Post Compile IL编织产生更好的IL。

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

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

第二个阵营非常罕见,我能想到的唯一一个项目是Entity Framework(它用于Lazy加载,但是它不可扩展,无法自定义)。

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

  • Postsharp Pro
  • Mono.Cecil能
  • Fody(mono.cecil包装)

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

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

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

例如: 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 )来拦截调用。 因此,您无需更改方法代码。

使用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-PostShttp://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

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

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

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

一些示例插件是:

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

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