代码执行流程
在讲反射之前,我们先来看下我们写的代码究竟是如何被计算机执行的,这里给大家画了个图,如下所示
执行过程
- VS编译器会将编写好的代码进行编译,编译后会生成exe/dll文件,.Net Core里面已经不生成exe了,都是dll。dll和exe还需要CLR/JIT的即时编译成字节码,才能最终被计算机执行。
- 有伙伴就会问为什么要编译2次呢,先编译到dll,再编译到字节码01呢,为什么不能一次性编译成字节码呢?因为C#语言,但是真实运行的机器有很多种,可能是32位,也可能是64位,操作系统可能是windows、linux、unix等,不同的计算机不同的操作系统识别字节码的可能是不一样的,但是从高级语言编译成exe/dll这一步是一样的。所以只要在不同运行环境的计算机上安装对应的不同的CLR/JIT,就可以运行我们同一个exe/dll了。这里就大概讲下这样一个过程,后面会有章节详细讲解程序如何被计算机执行的。现在我们先关注编译生成的exe/dll,它包含2部分,分别是中间语言IL和源数据元数据metadata。
- IL里面包含我们写的大量的代码,比如说方法、实体类等
- 元数据metadata不是我们写的代码,它是编译器在编译的时候生成的描述,它可能是把命名空间、类名、属性名记录了一下,包括特性
反射 就是读取metadata(基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码里面的数据的,然后去使用它
标签:反射,exe,System,dll,编译,方法 From: https://www.cnblogs.com/blackamon/p/17482501.html反射的作用:
- 动态创建类型的实例,将类型绑定在现有对象,或从现有对象中获取类型
- 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型
反射注意点:
- 使用反射动态绑定需要牺牲性能
- 有些元数据信息是不能通过反射获取的
取得Assembly的方法:
Assembly.Load Assembly.LoadFile Assembly.LoadFrom Type对象的Assembly方法
创建实例的方法
System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集 System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。 System.reflection.constructinfo 的Invoke实例方法