c# - OnMethodBoundaryAspect 是如何工作的?

标签 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)?

最佳答案

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

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

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

关于c# - OnMethodBoundaryAspect 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9851150/

相关文章:

C#程序Windows与linux时间同步

C#:<T> 的列表 = <Derived from T> 的列表不编译

session - 为什么 session 属性在 Servlet 中不是线程安全的?

F# abstractclass 和 abstractclassattribute 有什么区别

c# - 如何更改 ms 图表中 X 轴标签的方向

.net - FindAll() 的 DirectorySearcher.SizeLimit = 1 是否等于 FindOne() [DirectoryServices/.net]

c# - ServiceStack EnryptedClient 使用 IReturnVoid DTO 错误

.net - 如何加速 "Verifying Application Requirements"窗口?

Python 如何打印 itertools.permutations 的属性

c# - 在 DataGridView 中禁用编辑