我创立了 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 代码)。再次澄清:
- 代码是使用分配的属性构建的。
- 在构建期间,根据编写的 BuildTasks 调用特定代码
- BuildTasks 使用反射来查找包含必要属性的代码片段
- BuildTasks 使用 Mono.Cecil 将代码动态注入(inject)到找到的那些部分
- 构建完成。您编译的 dll 现在不仅包含编写的代码,还包含更改为某些代码的属性。我建议使用 ILSpy 或类似的反编译器查看程序集,看看您的初始代码和生成的代码之间的区别。
我建议查看 KindOfMagic查看自动 INotifyPropertyChanged 的 RaisePropertyChanged 如何作为属性实现的代码。它为创建自定义方面提供了宝贵的见解,尽管它可能被证明是艰难而乏味的过程。
关于c# - OnMethodBoundaryAspect 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9851150/