实现静态AOP,就需要我们在预编译时期,修改IL实现对代码逻辑的修改。Mono.Cecil就是一个很好的IL解析和注入框架,参见编译时MSIL注入--实践Mono Cecil(1)。

我的思路为:在编译时将加有继承制MethodInterceptBaseAttribute标签的原方法,重新组装成一个方法(并加上[CompilerGenerated]标签),在加入横切注入接口前后代码,调用此方法。

比如代码:

[TestAOPAttribute(Order = 1)]

public Class1 TestMethod1(int i, int j, Class1 c) 
        { 
            Console.WriteLine("ok"); 
            return new Class1(); 
        }

public class TestAOPAttribute : Green.AOP.MethodInterceptBase 
    {

#region IMethodInject Members

public override bool Executeing(Green.AOP.MethodExecutionEventArgs args) 
        { 
            Console.WriteLine(this.GetType() + ":" + "Executeing"); 
            return true; 
        }

public override Green.AOP.ExceptionStrategy Exceptioned(Green.AOP.MethodExecutionEventArgs args) 
        { 
            Console.WriteLine(this.GetType() + ":" + "Exceptioned"); 
            return Green.AOP.ExceptionStrategy.Handle; 
        }

public override void ExecuteSuccess(Green.AOP.MethodExecutionEventArgs args) 
        { 
            Console.WriteLine(this.GetType() + ":" + "ExecuteSuccess"); 
        }

#endregion

#region IMethodInject Members

#endregion 
    }

将会转化(实际注入IL,这里反编译为了c#代码,更清晰)为:

从这里你就会清晰的明白这里实现静态注入了机制和原理了。我们需要做的目的就是从IL出发改变原来代码逻辑,注入我们的截取代码。使用Mono.Cecil具体代码在程序包MethodILInjectTask中。

MatchedMethodInterceptBase是应用于class上匹配该class多个methodattribute基类。rule为匹配规则。

[TestAOP2Attribute(Rule = "TestMethod1*")]

public class Class1

这里需要对于继承制该基类的标示class的所有满足rule的方法进行注入。

PropertyInterceptBase:属性注入,Action属性标识get,set方法。

[TestAOPPropertyGetAttribute(Action = PropertyInterceptAction.Get)] 
       public int TestProperty 
       { 
           get; 
           set; 
       }

属性注入找出标示property,更具action选择get,set方法注入IL逻辑。

现在对于方法中获取attribute通过反射,性能存在一定问题。完全可以在class中注入属性,延时加载,Dictionary类级缓存来减少这方面损失,还暂时没考虑加入。

不是很会写blog,所以有什么不明白的可留言,上一篇MSBuild + MSILInect实现编译时AOP之预览,由于时间写的没头没尾的,估计大家都看的很迷茫,迷茫该怎么写。关于IL注入Mono.Cecil可以参见编译时MSIL注入--实践Mono Cecil(1)和官方http://www.mono-project.com/Cecil。还有必须对MSIL具有一定了解(相同与Emit的IL注入)

附带:源码下载

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客、博客园--破狼和51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2011/08/09/2133106.html

MSBuild + MSILInect实现编译时AOP-改变前后对比相关推荐

  1. 使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题

    理想的代码优化方式 团队日常协作中,自然而然的会出现很多重复代码,根据这些代码的种类,之前可能会以以下方式处理 方式 描述 应用时可能产生的问题 硬编码 多数新手,或逐渐腐坏的项目会这么干,会直接复制 ...

  2. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

    文章目录 一.Android 中的 Java 源码打包流程 1.Java 源码打包流程 2.字符串常量池 二.Android 中的字节码操作方式 一.Android 中的 Java 源码打包流程 Ja ...

  3. 编译时MSIL注入--实践Mono Cecil(1)

    紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务-MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注 ...

  4. TypeScript 3.9 正式发布!平均编译时长从 26 秒缩短至 10 秒

    作者 | 微软官方博客 译者 | 核子可乐 策划 | 小智 稿源 | 前端之巅 今天,微软在其官方博客宣布:TypeScript 3.9 版本已经正式发布,详情见下文. 有些朋友可能对 TypeScr ...

  5. 使用roslyn代替MSBuild完成解决方案编译

    原本我是使用批处理调用 MSBuild 完成解决方案编译的,新版的 MSBuild 在 Visual Studio 2015 会自带安装. 当然在Visual Studio 2015 中,MSBuil ...

  6. java AST 表达式_java 编译时注解-AST 抽象语法树简介

    AST 语法入门 以前使用 Lombok 一直觉得是一个很棒的设计,可以同时兼顾注解的遍历和运行的性能. 运行时注解一直因为性能问题被人诟病. 自己尝试写过一些框架,但是耗费了比较多的精力,因为 AS ...

  7. Xamarin.iOS编译时无法连接苹果系统

    Xamarin.iOS编译时无法连接苹果系统 错误信息:Unable to connect to Address='***.***.***.***' with User='***' 即使Visual ...

  8. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)...

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

  9. C# 9 新特性:代码生成器、编译时反射

    前言 今天 .NET 官方博客宣布 C# 9 Source Generators 第一个预览版发布,这是一个用户已经喊了快 5 年特性,今天终于发布了. 简介 Source Generators 顾名 ...

最新文章

  1. javascript 手势缩放 旋转 拖动支持:hammer.js
  2. CSS jQuery制作漂亮的文字模糊效果
  3. 谷歌最新论文:从图像中进行3-D目标检测
  4. Facebook开源AI硬件 联手NVIDIA开发人工智能
  5. matlab在电力行业中的仿真技术-MATLAB基于EKF算法估计电动汽车蓄电池的SOC
  6. 【计算机网络(微课版)】第5章 传输层 课后习题及答案
  7. 【论文解读】GCN论文总结
  8. 为了不再颓废,不再堕落......转操作系统为ubuntu,转语言环境为java...
  9. 本地方法(JNI)——访问域+字符串参数
  10. linux sh expr冒号,linux expr命令参数及用法详解
  11. [Elasticsearch] es 6.8 编译报错 invalid type code: 85
  12. 场景欺诈的策略梳理、总结与实操
  13. 电子信息计算机调剂到能源动力,江苏科技大学机械、电子信息、电子信息能源动力、土木水利2020年考研调剂信息...
  14. python程序-第一个Python程序——在屏幕上输出文本
  15. [转载] PyTorch: 序列到序列模型(Seq2Seq)实现机器翻译实战
  16. 数论中的偶数阶Abel群的阶
  17. API网关之-协议转换原理
  18. matlab中min函数
  19. 在桌面计算机找不到驱动,电脑杀毒后桌面不见了的原因是什么_怎么解决 - 驱动管家...
  20. zabbix 快速入门

热门文章

  1. TimerHandler的简单应用
  2. Hyper-V 3.0功能部署PART 5:秒级实时迁移
  3. Heritrix源码分析(六) Heritrix的文件结构分析
  4. 当客户说“你们的价格太高了”
  5. “领悟”的价值是什么?思维能力训练问答
  6. Cookie和Session的区别
  7. 洛谷P3688/uoj#291. [ZJOI2017]树状数组
  8. C++ string 详解
  9. createjs开发h5游戏: 指尖大冒险
  10. 在.net中使用强类型来读取配置信息