![]() ![]() ![]() #String类型: 例如:我们定义了一个Myclass函数名,这个函数名就是保存在String类型里面的 #Guid堆 保存一系列数据,最典型的一个实例是:一个函数的参数,这个东西我们把它叫做一个参数集 #Blob 保存任意大小的数据 Matedata:用来描述数据的数据 怎么来理解呢? 因为程序代码是一个数据,那么描述这个程序代码的类型定义,这就是MetaData。 描述了程序中的哪些类型 它用两种形式保存,一种是表格(table),一种是堆,那么不管是堆也好,还是表格也好,都保存在Stream里面。 这个表总是压缩和未压缩的表示为一个横杠(—)和#号。 表的作用:有类型的定义,有类型的引用,对程序集的引用等这样的一个信息,或者对参数的引用,对方法的引用,对方法的定义,那这样一个信息都是以一个表的形式来保存的,表自然是有行也有列,那么行就是一个一个的数据 例如:一个定义(Class)占一行 那么列呢? 就是Class的信息,一列一列的来,这就是表的格式 堆:里面是一些松散的信息数据比如说:字符串 托管指针实际上是一个引用 比如:C#中的out、ref这就是引用。 例如:你想传一个int值,如果你想把这个int值传过去在传回来就用 ref 注意:传的指针是非null,指针内容为null..... 公共语言运行库 Invoke:托管代码和非托管代码之间的互操作性 问题: (1)、如何使用P/Invoke以及Pinvoke如何调用Windows API或者任意非托管代码? (2)、什么是平台(Platform)相关的非托管代码? (3)、什么是P/Lnvoke?及用途.... 【1】P/Lnvoke=Platform Lnvoke 【2】允许托管代码调用平台(Platform)先关的非托管代码 例如:C++、VB(这里指VB1、2 不是VB.NET)、Delphi等等非托管语言可以写出一个dll通过P/Lnvoke也可以去调用这些dll中所暴漏的一些函数,同时呢也可以去调用windows系统中dll所暴漏的一些API (4)、为什么要使用P/Lnvoke 【1】数组(.NET平台下,我们所写的C#程序,他编译出来的总是平台无关的中间代码,也就是微软的中语言,而这样的代码是通过JIT,也就是说"即时编译"在你运行的时候才编译出来的。同时你也不需要对内存进行管理,因为专门有GC(垃圾回收器)来负责清理内存)JIT和GC的性能十分优秀 (5)IL是谁来解析呢? (5)、.NET是什么? .NET是虚拟机、.NET是一个平台 .NET只懂IL(中间语言)而这种中间语言是靠.NET中的一种支架来解析。支架(一种动态编译支架)把IL编译成代码,然后再.NET中进行执行,所以说这是一种托管环境 IL代码的特点: 【1】与平台无关,也就是不绑定在任何平台上 【2】IL所有的数据都是是放在堆栈里 开发工具: 【1】ILASM:把IL编译成对应的PE文件,当然它里面装的还是IL和matadat文件,只不过它把它打包成了.NET,PE所认识的格式。那么IL的文本格式PE是不认识的所以需要编译器 【2】ILDASM:是反编译的,因为IL是固定的,所以对于ILDASM来说反编译还是比较容易 运行库:BCL .NET除了虚拟机之外,其实IL是做不了什么事情的 那么.NET就需要一个库 例如:最简单的输入/输出、文件操作、目录操作、网络操作等等这些东西都是用一套库来执行的 .NET只支持IL和MetaData那么如果你。如果你看到C#代码就能把C#代码翻译成IL,知道IL在.NET里面怎样运行,那么自然是水到渠成..... |
|
来自: 空城66 > 《.NET工作机制》