你需要一点点CIL
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
你需要一点点CIL的更多相关文章
- 用CIL写程序:你好,沃尔德
前言: 项目紧赶慢赶总算在年前有了一些成绩,所以沉寂了几周之后,小匹夫也终于有时间写点东西了.以前匹夫写过一篇文章,对CIL做了一个简单地介绍,不过不知道各位看官看的是否过瘾,至少小匹夫觉得很不过瘾. ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- 用CIL写程序:写个函数做加法
前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- 用CIL写程序:从“call vs callvirt”看方法调用
前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...
- 利用animation和text-shadow纯CSS实现loading点点点的效果
经常在网上看到loading状态时的点点点的动态效果,自己也用JS写了一个,思路是使用一个计数参数,然后在需要添加点的元素后面利用setInterval一个一个加点,当计数到3时,把点变为一个--写完 ...
- 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL 的区分与总结
关于CLR.CIL.CTS.CLS.CLI.BCL和FCL 的区分与总结 如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NE ...
- 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL
如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NET平台,学些.NET架构体系,针对一些常用常用名词的理解是很有必要的,未必 ...
- Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)
1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...
随机推荐
- ionic4 开发企业微信应用0
作为一个后台开发人员,几年前参与过Ionic1开发过一微信公众号的经历,所以这次开发企业微信应用,就使用了ionic,正好ionic4 rc版本发布,虽然不是正式版,作为本项目的项目经理,还是决定使用 ...
- CentOS6 网络设置
由于CentOS 6默认开启了arpcheck所以在配置网卡的时候需要关闭,否则导致网络服务启动失败 [root@Mysql ~]# vi /etc/sysconfig/network-scripts ...
- 算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)
数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用.因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队列.本篇博客其实就是<数据结构之线 ...
- .net core 灵活读取配置文件
using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using Syst ...
- [Swift]LeetCode640. 求解方程 | Solve the Equation
Solve a given equation and return the value of x in the form of string "x=#value". The equ ...
- [Swift]LeetCode641. 设计循环双端队列 | Design Circular Deque
Design your implementation of the circular double-ended queue (deque). Your implementation should su ...
- [Swift]LeetCode761. 特殊的二进制序列 | Special Binary String
Special binary strings are binary strings with the following two properties: The number of 0's is eq ...
- Java高级特性-String、StringBuffer和StringBuilder
Java高级特性-String.StringBuffer和StringBuilder String Java语言中的字符串值都属于String类,虽然有其他方法表示字符串(如字符串数组),但Java一 ...
- Kubernetes系列之理解K8s Service的几种模式
今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...
- 侯哥的Python分享
侯哥语录 我曾经是一个职业教育者,现在是一个自由开发者.我希望我的分享可以和更多人一起进步.分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么.当你还没 ...