9

我知道检测是一种将跟踪代码动态添加到方法中以启用跟踪和调试的技术。

我想知道这是否只是一个“跟踪”选项,硬编码到 CLR 中以仅添加跟踪代码,或者是否能够向方法中添加任何代码?

例如,我想在某个类中的每个方法调用的开头检查一个条件(比如权限)。我可以通过在执行时将动态代码添加到方法的开头来做到这一点吗?

我不确定这个跟踪“仪器”是如何工作的,但我想知道这是否也可以用于其他目标。

4

5 回答 5

4

基本上你应该做的是编写一个 CLR 探查器并在 c++ 中使用探查器 API
你需要实现 ICorProfilerCallback 接口。
您正在寻找的是 JITCompilationStarted 回调。每次调用托管方法时以及在 jit 编译器将 IL 编译为机器代码之前都会调用此方法。运行时的任何代码插入工作都应该在 JITCompilationStarted 中完成。
您可以查看开源覆盖工具部分封面作为示例如何做到这一点。

于 2010-03-20T05:12:32.183 回答
3

您指的是面向方面的编程(AOP)。

看看PostSharp

另外:C# 中的开源面向方面的框架

于 2010-03-17T11:48:39.863 回答
2

正如其他人所回答的那样,此类横切关注点通常通过面向方面的编程(AOP) 来解决。

执行 AOP 的一种方法是使用 PostSharp 等工具进行代码检测,但另一种不需要额外工具的替代方法是利用依赖注入(DI) 和装饰器设计模式。

假设您的代码使用了 IFoo 接口:

public interface IFoo
{
    string GetStuff(string request);
}

您可能MyFoo对 IFoo 有一个具体的实现,但您也可以编写一个或多个处理不同方面的装饰器:

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 容器)包装MyFooAdministratorGuardingFoo. 所有消费的消费者IFoo都不会注意到差异。

于 2010-03-17T12:00:52.033 回答
0

我知道PostSharp允许您通过属性向现有方法添加“方面”,以便您可以将进入/退出跟踪添加到您的方法中

于 2010-03-17T11:48:05.957 回答
0

CLR 允许通过消息接收器进行方法拦截。

于 2010-03-17T12:19:13.777 回答