首页 > 代码库 > 什么是Emit,什么是反射,二者区别到底是什么?(转)

什么是Emit,什么是反射,二者区别到底是什么?(转)

Emit的准确定义,我们看看微软给出的答案
System.Reflection.Emit 命名空间包含{

允许编译器或工具发出元数据发出 Microsoft 中间语言 (MSIL) ,并可选择在磁盘上生成 PE 文件的类。

这些类的主要客户端是脚本引擎和编译器。

}

 

 

Emit可以直接让编译器发出元数据及msil,这样做的优势又是什么?
MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成Microsoft 中间语言 (MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码.

 

所以,我们的.NET程序最终都是以这些中间语言存储起来的,在运行后,又由即时编译器直接转换成真正的机器语言执行. emit这种优势在于可以在程序动态运行的过程中,直接生成IL运行(可谓灵活且不失高效)

 

 

 

反射的原理及性能问题引用Jeffrey Richter的一段话: 元数据是用一系列的表来存储的.生成一个程序集或模块时,编译器会创建一个类型定义表、一个字段定义表、一个方法定义表以及其他表.利用反射命名空间(sytem.reflection,所以可知emit是其一个附属,不是独立的)中包含的一些类型,可以用代码来解析(就是所谓的反射)这些元数据表.

 

反射有两个缺点:1.反射无法在编译期间保证类型的安全;2.反射速度慢.(我们需要使用sytem.reflection命名空间中的类型扫描程序集的元数据,反射要不断地执行字符串的搜索) 

 

 

 

总结反射包含emit,反射性能低原因在于需要扫描程序集或模块的元数据表.emit性能高,在于能够动态生成msil立即执行.它们各据其位,所以用emit时其实你就在用反射(至少你需要它).为了提高性能,我们可以动态创建一些方法来达到我们想要的目的(动态代理).

 (术语有不足之处,希望纠正)

什么是Emit,什么是反射,二者区别到底是什么?(转)