背景及现状:之前分享的那篇“面向切面编程–渲染监控日志记录方案”中提供了利用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# IL中间代码注入实现切面编程的更多相关文章

  1. 依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦(转good)

    依赖注入(DI)有助于应用对象之间的解耦,而面向切面编程(AOP)有助于横切关注点与所影响的对象之间的解耦.所谓横切关注点,即影响应用多处的功能,这些功能各个应用模块都需要,但又不是其主要关注点,常见 ...

  2. Spring.Net控制翻转、依赖注入、面向切面编程

    Spring.Net快速入门:控制翻转.依赖注入.面向切面编程 Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control)  理解成抽象工厂翻转控制:就是创建对象 ...

  3. 如何通俗的理解spring的控制反转、依赖注入、面向切面编程等等

    之前一直不理解spring的一些基础特性是什么意思,虽然网上的解释也很多,但是由于我比较笨,就是看不懂,知道最近才稍微了解,下面就以通俗讲解的方式记录下来. 前言 假设我是一个没有开店经验的小老板,准 ...

  4. Spring.Net快速入门:控制翻转、依赖注入、面向切面编程

    Spring.Net主要功能: 1.IoC:控制翻转(Inversion of Control)  理解成抽象工厂翻转控制:就是创建对象的权利由开发人员自己控制New,转到了由容器来控制. 2.DI: ...

  5. Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)

    Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么?    IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...

  6. Spring Aop面向切面编程&&自动注入

    1.面向切面编程 在程序原有纵向执行流程中,针对某一个或某一些方法添加通知,形成横切面的过程叫做面向切面编程 2.常用概念 原有功能:切点,pointcut 前置通知:在切点之前执行的功能,befor ...

  7. Spring核心思想:IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)

    Spring有三大核心思想,分别是控制反转(IOC,Inversion Of Controller),依赖注入(DI,Dependency Injection)和面向切面编程(AOP,Aspect O ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十 || AOP面向切面编程浅解析:简单日志记录 + 服务切面缓存

    代码已上传Github+Gitee,文末有地址 上回<从壹开始前后端分离[ .NET Core2.0 Api + Vue 2.0 + AOP + 分布式]框架之九 || 依赖注入IoC学习 + ...

  9. C# 中使用面向切面编程(AOP)中实践代码整洁

    1. 前言 最近在看<架构整洁之道>一书,书中反复提到了面向对象编程的 SOLID 原则(在作者的前一本书<代码整洁之道>也是被大力阐释),而面向切面编程(Aop)作为面向对象 ...

随机推荐

  1. Freemarker中大于号>的使用

    在Freemarker中,比较数据的大小时候,要注意大于号(>)的使用.如果不注意,程序就会发生异常信息,如下面的例子:   1 2 3 4 <#assign x = 4> < ...

  2. python基础语法学习常见小问题

    说明:我是最近觉得python在完成很多工作中方便使用而且功能强大,想突击学习一下.用的是廖雪峰老师的教程,学习python3.X.这里是廖雪峰老师的网站链接: http://www.liaoxuef ...

  3. thinkphp URL 模式

    兼容ThinkPHP三种url模式的nginx rewrite location / { root /var/www; index index.html index.htm index.php; if ...

  4. margin和text-align以及align

    margin和text-align是css样式,align是html的 <style> .test { width: 400px; height: 200px; background: g ...

  5. QPixmap显示图片 并 修改图片

    http://hi.baidu.com/eygaqurchnbhsyq/item/2b9624006120f2edff240d42 QPixmap显示图片 现在我们来实现在窗口上显示图片,并学习怎样将 ...

  6. 不理解use explanatory variables

  7. Memcache笔记(1)

    缓存主要分为:页面缓存和数据缓存 Memcache .redis.mongodb都是做数据缓存的 Memcache是什么? 是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的ha ...

  8. tar 或 7z 备份项目

    mac, tar #!/bin/sh projPath=~/Developer projName=youku now=`date +%Y-%m-%d-%H-%M-%S` output=$projNam ...

  9. Tomcat翻译--Context Container

    原文:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Resource_Definitions The Context Cont ...

  10. cassandra cqlsh 和 python客户端

    Keyspaces A cluster is a container for keyspaces. A keyspace is the outermost container for data in ...