博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你需要一点点CIL
阅读量:6949 次
发布时间:2019-06-27

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

1.当我们程序集中有大量反射的时候,性能往往会下降很快。我们目的很明确 如何解决反射造成的这些影响,其中之一个正确且高逼格的做法是 使用 CIL指令去实现。如何实现需要我们拥有若干基础知识。知道 CIL,JIT基本编译,CLR运行机制,内存分配本质等等不需要太高层次的知识即可!当然你需要知晓若干的指令:例如: ld(入栈) ,st(出栈),conv(数字转换),b/br(条件/无条件 跳转),call(调用)系列。当然  .net 下 OpCodes 类为我们封装了一些东西,可以方便调用。网上创建dll 的Demo

一大把。。。废话不说类似代码如下: 1.构建程序集  2.构建模块  3.构建类  4.方法签名 5.方法实现
6.方法调用
 Demo 如下:

//程序集            var assemblyName = new AssemblyName("CCX_PetShop");//创建程序集            var dllBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, System.Reflection.Emit.AssemblyBuilderAccess.RunAndSave);            //模块            var body = dllBuilder.DefineDynamicModule("CCX_Emit", "CCX_Emit.dll");            //方法            var bodyClass = body.DefineType("TestEmit", TypeAttributes.Public);//定义类            //构建 public viod EmitClass(){ }类型;            var dynamicMethod = bodyClass.DefineMethod("EmitClass", MethodAttributes.Public | MethodAttributes.Static, null, null);            var ilBuilder = dynamicMethod.GetILGenerator();            ilBuilder.Emit(OpCodes.Ldstr, "CCX  Emit Reflection");//加载字符串            ilBuilder.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));            ilBuilder.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));            ilBuilder.Emit(OpCodes.Pop);//要将变量值抛弃后续没有使用到            ilBuilder.Emit(OpCodes.Ret);            var rundll= bodyClass.CreateType();            dllBuilder.SetEntryPoint(rundll.GetMethod("EmitClass"));            dllBuilder.Save("EmitTest.exe");           //dllBuilder.Save("CCX_Emit.dll");//保存为程序集外面调用

打开 bin debug 下看到了 EmitTest.exe 执行后不出意外的 运行 EmitTest.exe 出现了 CCX  Emit Reflection   。。
PS:就是这么简单的动态构建一个 dll,貌似和我们的目标 用 Emit 方式代替直白的反射 有所差距。还是一步一步来。步子大了容易扯着蛋。一下子贴出来按照人类接受新事物的惯性思维肯定对它是排斥的。

同步的QQ空间博客地址:http://user.qzone.qq.com/2129635526/blog/1458573638

转载于:https://www.cnblogs.com/LiMin/p/5306140.html

你可能感兴趣的文章
网络编程的演进——从Apache到Nginx
查看>>
mui 中template 的使用
查看>>
2018.11.04-3988-地理课(geography)
查看>>
linux命令总结
查看>>
[激励机制]浅谈内部竞争——如何让你的员工玩命干活?
查看>>
把一个控制器的view添加到另外一个控制器
查看>>
pc端和移动端下拉刷新
查看>>
Maven详解之聚合与继承
查看>>
Spark(二)CentOS7.5之Spark2.3.1HA安装
查看>>
内存池和tcmalloc的性能比较
查看>>
大白话5分钟带你走进人工智能-第二十三节决策树系列之特点和数学表达形式(2)...
查看>>
GOF设计模式汇总
查看>>
Ehcache整合spring配置,配置springMVC缓存
查看>>
华为敏捷/DevOps实践:如何开好站立会议
查看>>
NDN与TCP/IP
查看>>
Java MVC设计模式
查看>>
android Studio快捷键
查看>>
js的 new Date()日期格式化显示以及js获取时间戳
查看>>
区块链中的节点是什么?
查看>>
要不要跟风iPad
查看>>