我知道检测是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。
我想知道这是否只是一个“跟踪”选项,硬编码到CLR中以仅添加跟踪代码,还是能够向方法添加任何代码?
例如,我想检查某个类中每个方法调用开头的条件(比如权限)。我可以通过在执行时间的方法开头添加动态代码吗?
我不确定这种跟踪“仪器”的工作原理是什么,但我想知道这是否可以用于其他目标。
答案 0 :(得分:4)
基本上你应该做的是写一个CLR分析器并使用c ++中的profiler API 您需要实现ICorProfilerCallback接口 您正在寻找的是JITCompilationStarted回调。每次调用托管方法时以及在jit编译器将IL编译为机器代码之前,都会调用此方法。 运行时期间的任何代码插入工作都应在JITCompilationStarted中完成 您可以查看开源覆盖工具part cover作为示例。
答案 1 :(得分:3)
答案 2 :(得分:2)
正如其他人所回答的那样,横向关注通常会通过面向方面编程(AOP)解决。
执行AOP的一种方法是使用PostSharp等工具进行代码检测,但是不需要额外工具的替代方法是使用依赖注入(DI)和Decorator设计模式
想象一下,您的代码使用了IFoo接口:
public interface IFoo
{
string GetStuff(string request);
}
您可能有一个IFoo的具体实施MyFoo
,但您也可以编写一个或多个处理不同方面的装饰器:
public class AdministratorGuardingFoo : IFoo
{
private readonly IFoo foo;
public AdministratorGuardingFoo(IFoo foo)
{
if (foo == null)
{
throw new ArgumentNullException("foo");
}
this.foo = foo;
}
public string GetStuff(string request)
{
new PrincipalPermission(null, "Administrator").Demand();
return this.foo.GetStuff(request);
}
}
您现在可以(让您的DI容器)在MyFoo
中包裹AdministratorGuardingFoo
。消耗IFoo
的所有消费者都不会注意到差异。
答案 3 :(得分:0)
我知道PostSharp允许您通过归因向现有方法添加'方面',这样您就可以在方法中添加进入/退出痕迹
答案 4 :(得分:0)