OnMethodBoundaryAspect如何运作?

时间:2012-03-24 10:55:20

标签: c# .net attributes aop

我在OnMethodBoundaryAspect中创建了PostSharp library属性。它可以拦截进入和退出方法,如下所示:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, Inheritance = MulticastInheritance.Multicast)]
public class InterceptAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    { }

    public override void OnExit(MethodExecutionArgs args)
    { }
}

public class A
{
    [Intercept]
    public void foo() { }
}

我的问题是“它是如何运作的?”我该怎么做才能编写自己的属性,能够拦截进入和退出方法(没有PostSharp使用ofcourse)?

1 个答案:

答案 0 :(得分:9)

首先,我建议阅读documentation以下内部工作(“它是如何工作”部分和其他部分)。基本上,属性在构建时被转换为相关代码(实际上,主要是在构建之后但仍在构建时)。有一个MSBuild task的概念,它指定了在构建过程中运行的代码。代码在编译完成后执行,并查找特定属性(如InterceptAttribute),并可对已编译的代码执行更改。使用Mono.Cecil库时可以执行对代码的运行时编辑(它允许注入/删除IL代码)。再一次澄清:

  1. 代码是使用已分配的属性构建的。
  2. 在构建期间,根据编写的BuildTasks调用特定代码
  3. BuildTasks使用反射来查找包含必要属性的代码片段
  4. BuildTasks使用Mono.Cecil动态地将代码注入到那些找到的部分
  5. 构建完成。您编译的dll现在不仅包含编写的代码,还包含更改为某些代码的属性。我建议用ILSpy或类似的反编译器查看程序集,看看你的初始代码和生成的代码之间的区别。
  6. 我建议查看KindOfMagic代码,了解自动将INotifyPropertyChanged的RaisePropertyChanged实现为属性。它提供了有关创建自定义方面的宝贵见解,但它可能会证明是艰难而乏味的过程。