.Net中对象结构

首先说明->对象还是结构体没有区别,不管存储于堆函数栈就是内中一个数据块而已.

Class A{}=struct A{LPVOID MT}

以上是一个对象的基本结构也就是基类Object包含一个指针指向MT(Method Table方法表,方法表中不仅包含方法信息,还包括类型信息,接口实现,基类,模块信息,类加载器)

对象的类型反射其实就是通过对象的MT指针找到MT然后对MT信息一个查询分析过程,强类型系统对于类型的验证等操作都是通过MT来完成,包括JIT,垃圾回收等框架基层都是通过MT完成。

所以只要修改对象MT指针就可以任意改变一个对象的类型,但是修改对象的类型并不是一个很安全的做法,必须足够了解对象的存储结构,否则修改对象类型将给程序带来灾难,直接导致程序崩溃。

同样我们也可以使用这个原理在非托管内存构建一个托管对象出来,那么这个对象不再托管内存区域部受到GC的控制,同样对于这样的对象进行释放,也不会对GC造成影响,对于程序有大量内存消耗的时候GC往往无法满足需求频繁的调用GC回收内内存会导致程序运行性能严重下降,并且不是说GC调用就能确保对象被回收。那么这样的方案将使程序的对于内存的控制变得更加灵活,C的优势在于控制灵活,虽然没有垃圾回收,但是个人编写C的代码上来说没有发现过内存泄露,内存消耗完成在控制范围以内,自己明确什么改去释放,什么样的内存需要去释放,申请内存的时候需要想清楚内存在那里使用时最后的使用那么就在那个位置释放,可以使用SEH保证任何情况下内存得到释放。

面向对象只是思想而已;

Class A{char c;}=struct A{LPVOID MT,char c}

Class B{char c;}=struct B{LPVOID MT,char c}

假定A和B同时拥有PrintChar方法

public void PrintChar(){Console.WriteLine(this.c)};=void PrintChar(B * this){Console.WriteLine(this->c)}

由于B结构体和A结构体结构相同,那么将A对象转换B对象,然后调用PrintChar是兼容的,因为内存结构相同所以不会出现文件,面向对象只是一个思想,也是在于这个,所谓面相对象的语言其内部还是面向过程,所以面向对象的东西都可以在面向过程实现,因为面向对象的语言还是面向过程只是对于程序员来说写的面向对象,就好比处理器只认识0和1的问题。对于计算机来说不管你写什么东西上去最终还是0和1,只是包装层面不同,低级语言可以实现高级语言的任何功能,但高级语言不能完成所有低级语言能够完成的功能,GC在神秘也就是内存扫描器,配合MT分析对象引用关系确定内存是否应该释放。

在C#下启动不安全代码就可以完成对于对象类型的修改,以及不通过is 关键字判断出来对象的类型,将托管对象直接传递到非托管二无需框架的封送,封送也是非常消耗资源的。

CreateFileMapping,ViewMapingOfFile然后在去修改MT即可瞬间将一个文件装换为一个对象,以及将一个对象瞬间转换为一个文件,根本不需要复杂的计算。

List<Object> a=new List<Object>()

List<string> b=new List<string>()

在2.0下b不能转换为a 4.0下已经可以做到了协变和逆变

如果利用MT修改那么b转换a是完全兼容的

Object和stirng同时都是指针

相当两个指针的数组那么完全兼容,指针大小同样的平台是相同的

但是2.0下不允许这样的转换,往往需要自己通过循环去复制一个出来。那么借助修改MT即可完成这样的需求,

比自己能够访问一个类型但是你无法构造这个对象,那么你就可以通过内存分配来伪造一个对象出来,构造函数是否执行拿已经无所谓了,构造也就是进行对象的初始化(非托管资源相关的类型伪造没有任何价值)

对象的克隆(深拷贝和浅拷贝业完全可以通过这个快速实现,性能上远远超过系统自带的浅拷贝和通过序列化反序列化深拷贝)自己完全可以根据MT中关键字段的定义实现深拷贝。

很多东西都可以利用修改MT读取MT来完成,大幅度提高程序效率。甚至你根据MT信息直接修改掉一个方法的实现,运行时动态生成一个类型出来,而且不需要编译器。

获取和修改定位MT需要使用指针,可以定义一个类型包含至少两个字段然后用属性控制成员布局,fiexd固定对象得到对象地址,两个成员一个为Object一个是指针的指针,通过Fiexd取地址然后让第二个成员的地址指向第一个成员的地址,Object为指针,那么第二个成员的值将是第一个成员的MT,这个时候我们就可以获得对象的MT以及进行修改。

具体代码我就不贴出(贴出来没用,能够运用的人自己能写出来,运用不了只会给系统带来灾难),欢迎一同讨论,以上分析有错误的地方欢迎大家指出,文采不好随便写的。以上理论全部经过本人验证。

电子邮件1:liujunqi999@hotmail.com

电子邮件2:liujunqi999@vip.qq.com

欢迎大家发邮件共同讨论,。Net框架底层的结构

对于.Net应用层东西不感兴趣(特别是ASP.Net和ADO.Net,WinForm.Net还有些兴趣,ASP.Net和ADO.Net太简单),

当然OS内核也比较感兴趣但是不算非常深度了解,Ntoskel,NTLDR,还有计算机硬件原理方面的东西比较感兴趣但是了解太少,希望高手指点

原文地址:https://www.cnblogs.com/a185771876/p/2304203.html