紧接上两篇浅谈.NET编译时注入(C#-->IL)和浅谈VS编译自定义编译任务—MSBuild Task(csproject),在第一篇中我们简单研究了c#语法糖和PostSharp的MSIl注入,紧接第二篇中我们介绍了自定义MSBuild编译任务(记得有位老兄发链接用 MSBuild自动发布Silverlight xap ,我想说的我做的是自定义编译任务,不是什么发布,MSBuild本就是一个发布工具)。之所以在此前介绍编译Task是因为我讲介绍的就是利用MSBuild和MSILInject制作静态注入式AOP,想成熟的产品PostSharp,当然我也不会去重造轮子,但需要明白起原理和自动化注入时机。废话不多说,今天将请出我们的MSIL注入的好东西:Mono.Cecil.官方网站http://www.mono-project.com/Cecil,他是一个强大的MSIL 注入工具,在我们的Reflector插件Reflexil(动态修改程序集插件,很好用,我已经尝试多次)就有他的身影出现。还有如大名鼎鼎的SharpDevelop,LINQPad,Ja.NET等等(可以参见https://github.com/jbevain/cecil/wiki/Users)。

在本节我们需要看看这个Mono.Cecil,先来一个简单的认识。

我来在我们的方法执行前后加入我们的输出信息:

原来代码:

class Program 
   { 
       static void Main(string[] args) 
       { 
           Console.WriteLine("破浪Blog:http://www.cnblogs.com/whitewolf/"); 
       } 
   }

任务:

1我将在方法执行前后添加一个Console.WriteLine("Method start…");

2方法最后添加Console.WriteLine("Method finish…“);

具体Mono.Cecil Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Mono.Cecil; 
using Mono.Cecil.Cil;

namespace BlogSample 

    class Program 
    { 
        static void Main(string[] args) 
        { 
            AssemblyDefinition assembiy = AssemblyFactory.GetAssembly(args[0]); 
            foreach (Mono.Cecil.TypeDefinition item in assembiy.MainModule.Types) 
            { 
                foreach (MethodDefinition method in item.Methods) 
                { 
                    if (method.Name.Equals("Main")) 
                    {

var ins = method.Body.Instructions[0]; 
                        var worker = method.Body.CilWorker; 
                        worker.InsertBefore(ins, worker.Create(OpCodes.Ldstr, "Method start…")); 
                        worker.InsertBefore(ins, worker.Create(OpCodes.Call, 
                            assembiy.MainModule.Import(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })))); 
                        ins = method.Body.Instructions[method.Body.Instructions.Count - 1];

worker.InsertBefore(ins, worker.Create(OpCodes.Ldstr, "Method finish…")); 
                        worker.InsertBefore(ins, worker.Create(OpCodes.Call, 
                            assembiy.MainModule.Import(typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) })))); 
                        break; 
                    } 
                }

}

AssemblyFactory.SaveAssembly(assembiy, "IL_" + args[0]); 
            Console.Read(); 
        } 
    } 
}

DOS运行结果:

我们在来看看反编译后的MSIL

C#:

在这最后我们可以想一下,如果我们利用Mono.Cecil可以干些什么事情,能做的当然很多,我首先想尝试的了与上一节浅谈VS编译自定义编译任务—MSBuild Task(csproject)结合PostSharp一样的静态注入AOP框架。还能做什么的就要靠大家发挥大家聪明的才智。

本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2011/07/28/2119969.html,如需转载请自行联系原作者

编译时MSIL注入--实践Mono Cecil(1)相关推荐

  1. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...

  2. MSBuild + MSILInect实现编译时AOP-改变前后对比

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

  3. Android APT(编译时代码生成)最佳实践

    越来越多第三方库使用apt技术,如DBflow.Dagger2.ButterKnife.ActivityRouter.AptPreferences.在编译时根据Annotation生成了相关的代码,非 ...

  4. 利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)

    原文:利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习) Mono.Cecil是一个强大的MSIL的注入工具,利用它可以实现动态创建程序集,也可以实现拦截器横向切入动态方法,甚至还 ...

  5. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  6. 使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

    使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model 2011-09-06 00:21 by 老赵, 8645 visits 这也是之前在珠三角技术沙龙上的示例之一,解决 ...

  7. Java注解处理器(编译时注解)

    https://race604.com/annotation-processing/ Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现 ...

  8. 什么叫编译时和运行时

    以前经常听说编译时和运行时的概念.但没太搞明白具体代表啥意思.后面花了点时间研究了下.总算知道个大概意思了. 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能 ...

  9. 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )

    文章目录 一.利用注解进行 AST 语法树转换 1.定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 2.AST 转换接口实现 3.定义 Groovy ...

最新文章

  1. convert-----Linux中的图片处理工具
  2. 如何以初学者角度写好一篇国际学术论文?
  3. 计算机信息管理技术 互联网,计算机信息管理技术在网络安全中的运用思路
  4. 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]
  5. 判断是否是电脑访问网站 1号店页面判断脚本
  6. LibSVM学习(六)——easy.py和grid.py的使用(转)
  7. 宏病毒的研究与实例分析06——终结篇 进击的MACRO
  8. JZOJ 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
  9. JAVA期末考试工程部分_知到Java程序设计(山西工程职业学院)考试期末答案
  10. 搭建golang webcron 定时任务管理平台
  11. java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态
  12. twisted 网络通信的简单例子
  13. java-将xlsx(excel)文件转换成json
  14. 【面试虐菜】—— MongoDB知识整理
  15. 特殊类型窗体制作: 制作字形窗体
  16. Redis protected-mode属性解读
  17. shell time 计算
  18. iOS 11 正式发布!最全功能介绍 + 视频 ...
  19. ICESat2学习笔记5 :ICESat-2数据下载
  20. 如何读取远程4G网络摄像头的视频流?

热门文章

  1. 乡村振兴谋定齐鲁样板-农业大健康·周荣江:国情讲坛创新
  2. mac打开class文件
  3. PostgreSQL 数据库备份
  4. win 文字转化为语音
  5. 转:在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程
  6. android或java timer声明
  7. QT 在定义新的类型时候,注意了(定义了ReadXml),在实现的时候加上Qlabel
  8. 设计模式十三:proxy(代理)——对象结构型模式
  9. 埋点、数仓到中台:数据体系的从0到1
  10. B端产品经理思考-软硬产品设计