有没有一种方法可以拦截一些方法调用,而不会在方法本身周围进行任何代码更改?
我不需要在运行时注入任何自定义行为,只需将自定义性能日志记录添加到现有项目中。
答案 0 :(得分:14)
您需要面向方面编程。
AOP有4种主要风味
RealProxy
以上是按执行速度(从最慢到最快)的顺序排序。注意最后两个"应该"速度相同。但是我希望编译器比Post Compile IL编织产生更好的IL。
第一阵营通常包括IOC容器,因为它们非常适合这种模式,包括但不限于
第二个阵营非常罕见,我能想到的唯一一个项目是实体框架(它用于延迟加载,但它不可扩展,无法定制) )。
第三阵营也非常敏锐,因为这种技术非常复杂和困难。这可以通过在编译后编辑dll程序集来实现,以添加所需的额外代码。
最后的阵营相对较新。事实上,新的唯一真正的入口是实验性的MS Roslyn。这实际上是一个C#编译器。所以...是的......它非常神奇。
现在,如果您遇到性能关键代码的真正巨大性能问题,我建议使用Fody。令人敬畏的是,它是免费的(与Postsharp Pro不同),它使用nuget和there is already a performance tool in Fody.MethodTimer。
答案 1 :(得分:3)
您可以查看面向方面编程,看看它是否适合您的情况。
http://fgheysels.blogspot.be/2006/11/aspect-oriented-programming-in-net.html
答案 2 :(得分:3)
您可以在方法执行之前或之后使用任何AOP框架(如Spring .NET或Unity)来拦截调用。 因此,您无需更改方法代码。
答案 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完成。
一些示例插件是:
要求,示例和文档可以在fodys github pages上找到。