博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSBuild + MSILInect实现编译时AOP-改变前后对比
阅读量:6404 次
发布时间:2019-06-23

本文共 1822 字,大约阅读时间需要 6 分钟。

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

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

比如代码:

[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,所以有什么不明白的可留言,上一篇,由于时间写的没头没尾的,估计大家都看的很迷茫,迷茫该怎么写。关于IL注入Mono.Cecil可以参见和官方。还有必须对MSIL具有一定了解(相同与Emit的IL注入)

   附带:

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

你可能感兴趣的文章
python中print的作用*8、不能+8_在 Python 3.x 中语句 print(*[1,2,3]) 不能正确执行。 (1.0分)_学小易找答案...
查看>>
python 生成html代码_使用Python Markdown 生成 html
查看>>
axure如何导出原件_Axure 教程:轻松导出图标字体所有图标
查看>>
laravel input值必须不等于0_框架不提供,动手造一个:Laravel表单验证自定义用法...
查看>>
cad填充图案乱理石_太快了吧!原来大神是这样用CAD图案填充的
查看>>
activator.createinstance 需要垃圾回收么_在垃圾回收器中有哪几种判断是否需要被回收的方法...
查看>>
rocketmq 消息指定_RocketMQ入坑系列(一)角色介绍及基本使用
查看>>
redis zset转set 反序列化失败_掌握好Redis的数据类型,面试心里有底了
查看>>
p图软件pⅰc_娱乐圈最塑料的夫妻,P图永远只P自己,太精彩了吧!
查看>>
jenkins 手动执行_Jenkins 入门
查看>>
怎么判断冠词用a还是an_葡语干货 | 葡萄牙语冠词用法整理大全
查看>>
js传参不是数字_JS的Reflect学习和应用
查看>>
三个不等_数学一轮复习05,从函数观点看方程与不等式,记住口诀与联系
查看>>
右键新建文件夹_Macos电脑鼠标右键木有新建文档咋办,有办法,莫捉急
查看>>
卡尺测量的最小范围_汽车维修工具-测量用具
查看>>
网优5g前景_5G网络优化师前景怎么样?
查看>>
竞态条件的赋值_[译] part25: golang Mutex互斥锁
查看>>
delmatch oracle_完美完全卸载(清除)oracle数据库的方式(方法)
查看>>
pyqt 滚动条 美化_Pyqt5 关于流式布局和滚动条的综合使用示例代码
查看>>
51单机片 编译hex_单片机爬坑记-05-编译环境(完)
查看>>