.Net进阶(5)使用Fody实现 .NET的静态编织
序言
广义的面向切面编程,有静态编织和动态代理两种形式,它们都可以在某个方法执行前后插入某种处理逻辑。不同的地方在于,前者发生在编译时期间,后者发生在运行时期间。
对于 .NET 而言,最常见的静态编织方案是 PostSharp 和 Mono.Cecil,两者的区别是:一个付费、一个免费。
本文介绍的 Fody 是一个基于 Mono.Cecli 的扩展库,通过 Fody 的各种插件,我们可以向已有代码织入特定的功能,譬如 Rougamo.Fody 这个插件可以让我们对方法进行拦截。
基于这个原理,我们实现了一个完全不同于动态代理的拦截器。动态编织的本质是修改 IL
代码,对于这一点我们可以通过 ILdasm.exe
这个工具来验证。
为了进一步了解 Fody 是如何修改 IL
代码的,我们参照 Fody 的规范实现了一个自定义的插件,在这个过程中,我们了解了几个常见 IL
指令,以及如何通过 Emit
来生成 IL
指令。
此时,我们就接触到比表达式树更为底层的东西,而操作 IL
指令更是让我们体会到写汇编语言的酸爽,同时让我们对 .NET
的编译原理有了更为直观的认识。
面向切面编程:动态代理、静态编织
Java 中有两种实现代理模式的方法:静态代理和动态代理。静态代理需要在编译之前手动编写代理类,而动态代理可以在运行时动态生成代理类。
其中动态代理又分为JDK动态代理和CGlib动态代理,一般情况下我们使用前者,当代理类没有接口时选用后者作为前者的补充方案。
资料
https://zhuanlan.zhihu.com/p/557599565