代码之家  ›  专栏  ›  技术社区  ›  Iravanchi

在运行时动态地向方法的开始/结束添加代码

  •  9
  • Iravanchi  · 技术社区  · 16 年前

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

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

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

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

    5 回复  |  直到 14 年前
        1
  •  4
  •   Ohad Horesh    16 年前

    基本上,您应该做的是编写一个clr分析器并使用 profiler API 在C++中
    您需要实现ICorProfileRCallback接口。
    您要查找的是jitcompilationStarted回调。每次调用托管方法时,以及在JIT编译器将IL编译为计算机代码之前,都会调用此方法。 运行时的任何代码插入工作都应该在jitcompilationStarted中完成。
    您可以查看开源覆盖工具 part cover 作为一个如何做的例子。

        2
  •  3
  •   Mitch Wheat    14 年前

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

    看一看 PostSharp .

    也: Open Source Aspect-Oriented Frameworks in C#

        3
  •  2
  •   Mark Seemann    16 年前

    正如其他人所回答的那样, 交叉关注 通常用 面向方面编程 (AOP)。

    实现AOP的一种方法是使用Postharp等工具进行代码插入,但是不需要额外工具的另一种方法是利用 依赖注入 (di)和 Decorator 设计模式。

    假设您的代码使用ifoo接口:

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

    你可能有一个具体的实施 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容器)包装 米福 在里面 AdministratorGuardingFoo . 所有消费的消费者 IFoo 不会注意到差异。

        4
  •  0
  •   zebrabox    16 年前

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

    推荐文章