是否可以通过 .NET 中的属性来分析单个方法?
我目前正试图找出大量使用静态方法的大型遗留应用程序中的一些瓶颈。目前,集成框架根本不是一种选择。由于大多数调用使用静态方法,接口(interface)和依赖注入(inject)不可用。破解代码以记录诊断信息也不是一个可行的解决方案。
我知道市场上有一些分析工具,但它们目前超出了预算。理想情况下,我将能够创建自己的自定义属性,该属性将记录有关方法进入和方法退出的一些基本信息。我从来没有真正使用过自定义属性,因此如果能深入了解这是否可能,我将不胜感激。
如果可能,我想通过配置文件启用分析。这将支持通过单元和集成测试进行分析。
最佳答案
你不能为你正在做的事情使用属性。但是,您确实有一些选择:
首先,许多分析器工具(如 RedGate ANTS )相对便宜(200-300 美元),易于使用,并且大多数提供几周的免费评估期 - 所以你可以看看他们是否会在您决定是否购买它们之前,为您提供您现在需要的电梯。此外,.NET CLR profiler可以免费下载。
如果这不可能,PostSharp 可能是将此类逻辑编织到代码中的最简单方法。
最后,如果您出于某种原因无法使用 PostSharp,并且您愿意为代码添加属性,那么您也可以以 using block 的形式为每个方法添加一个简单的检测 block :
public void SomeMethodToProfile()
{
// following line collects information about current executing method
// and logs it when the metric tracker is disposed of
using(MetricTracker.Track(MethodBase.GetCurrentMethod()))
{
// original code here...
}
}
典型的 MetricTracker 实现如下所示:
public sealed class MetricTracker : IDisposable
{
private readonly string m_MethodName;
private readonly Stopwatch m_Stopwatch;
private MetricTracker( string methodName )
{ m_MethodName = methodName; m_Stopwatch = Stopwatch.StartNew(); }
void IDisposable.Dispose()
{ m_Stopwatch.Stop(); LogToSomewhere(); }
private void LogToSomewhere()
{ /* supply your own implementation here...*/ }
public static MetricTracker Track( MethodBase mb )
{ return new MetricTracker( mb.Name ); }
}
关于.net - 使用属性的方法分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1489151/