反射反射,程序员快乐
虚伪
唉,一点都没感觉到快乐,理解起来其实很容易 就是把dll或者exe中的方法获取出来,然后使用,想想更像是在学校中的抄作业吧,emmm具体来说是抄答案,也不知道人家写个啥,然后改改凑凑 给了个答案,哈哈 抄数学一开始就这么干,给省几个步骤,和人家不太一样 ,想要自己实现还是挺难的 ,毕竟对方法不熟悉,本人也不想慢慢去查找资料,就找视频研究一下
语言的编写实现原理:
以Visual Studio 为例,在项目栏部分点击重新生成就会生成exe或者dll文件。啥?,你不知道位置,好吧 如下:
组成部分:
- metadata 元数据
任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode…)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。 - IL 中间语言
对于这个东西理解 通过ILSpy 反编译工具,其实就是打开dll,IL其实也是一种语言 如下:
中间语言了解就好 懂不懂 又不是做外挂,不那么重要
关于JIT:
什么是JIT
定义
这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如:
Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下。
简单来说 反射是.Net Framework提供的一个帮助类库,可以访问dll的metadata,并且使用它
Assembly
一般情况下,在C#文件目录下bin/debug中的dll或者exe的获取。操作方式有两种,一种是直接拷贝,一种是通过引用以及重新生成:
方法:
一般用的Assembly.Load
为了测试 我在unity中找到了一个postEffect.dll的文件进行操作
class Program
{
static void Main(string[] args)
{
Assembly assem = Assembly.Load("postEffect");
foreach(var ltype in assem.GetTypes())
{
Console.WriteLine(ltype.Name);
//foreach(var item in type.GetMethods())
//{
// Console.WriteLine(item.Name);
//}
}
Console.ReadKey();
}
}
然后就。。。。出现了报错
原因是没有导入依赖项,所以总结为 dll的反射处理 必须把依赖项也引用到才可以正常处理