C# IL中间代码注入实现切面编程

背景及现状:之前分享的那篇“面向切面编程–渲染监控日志记录方案”中提供了利用RealProxy作为代理类来生成代理的面向切面的编程方法,那个方法可以实现面向切面编程进行日志记录,现在渲染主程序也是采用的这种方式。那篇分享中也提到使用这中方式不适用于静态方法,而且代理类需继承一个接口或者MarshalByRefObject类,为此这里寻找到了另一种更直接的方法进行动态代理,来解决这两个弊端。

 

解决方案:.net的所有程序编译好后都会生成IL中间代码,为此如果能找到需要记录日志的方法的IL代码,在它的前后插入所需要的日志代码即可实现我们动态代理即记录日志的功能,这个就是我们今天要说的IL注入实现面向切面编程。这里要借助的注入工具是Mono.Cecil开发包,此工具包可以到NuGet上下载,Mono.Cecil地址 http://www.mono-project.com/docs/tools+libraries/libraries/Mono.Cecil/

 

代码实现:引入Mono.Cecil开发包后,创建我们需要的特性,用来标注我们的类和方法哪些需要进行日志记录,代码如下:

添加特性后,在需要进行日志注入的类和方法上添加上特性,这里对一个类的实例方法和静态方法进行标记,实例方法也不是接口中的方法,以验证是否能解决静态方法代理和不使用接口实现代理的问题,代码如下:

接下来显示没有注入前执行程序的显示界面,红色字体的为使用RealProxy代理继承接口实现日志记录,Not Logging开头的是没有实现接口方法和静态方法没法记录日志的内容:

现在实现IL代码注入的关键部分,代码如下:

然后运行注入程序,再打开注入后新生成的程序,即带有"_Injected"名的程序,即可看到如下显示:

黄色部分代码即为实现IL注入进行AOP动态代理后的内容,可以看到已经实现中间代码注入,为此可以证明这种方法达到预期的功能。

示例源代码如下:

https://download.csdn.net/download/hirisw/10486171

你可能感兴趣的:(C#)