OnMethodBoundaryspect是如何工作的

本文关键字:工作 何工作 OnMethodBoundaryspect | 更新日期: 2023-09-27 18:28:57

我在PostSharp库中创建了OnMethodBoundaryspect属性。它可以拦截进入和退出这样的方法:

[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)?

OnMethodBoundaryspect是如何工作的

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

  1. 代码是使用指定的属性生成的
  2. 在构建过程中,每个编写的BuildTasks都会调用特定的代码
  3. BuildTasks使用反射来查找包含必要属性的代码片段
  4. BuildTasks使用Mono.Cecil将代码动态注入到找到的部分
  5. 生成已完成。编译后的dll现在不仅包含编写的代码,还包含更改为某些代码的属性。我建议使用ILSpy或类似的反编译器查看程序集,看看初始代码和生成代码之间的区别

我建议查看KindOfMagic代码,了解自动INotifyPropertyChanged的RaisePropertyChanged是如何作为属性实现的。它为创建自定义方面提供了宝贵的见解,尽管这可能是一个艰难而乏味的过程。