一般软件的运行场景,客户端电脑需要安装.net framework CLR叫公共语言运行时或公共语言运行库,以及.net framework类库 CLR是.net framework的核心 CLR常用简写词语,CLR是公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间必要的分离。CLR存在两种不同的翻译名称:公共语言运行库和公共语言运行时。
CLR的执行过程 1、将源代码(vb、cs)编译成 托管代码块。托管代码块由中间语言和元数据组成。 2、将托管代码合并成程序集,也叫组件(dll)。程序集中包含了一张叫做“清单”的模块, 记录了构成程序 集模块构成的信息包括资源文件及需要引用自己的信息。 3、加载公共语言运行库。 4、执行程序集的代码。 5、生成本地代码。
---- CTS全称Common Type System是通用类型系统一种确定公共语言运行库如何定义、使用和管理类型的规范。 CLR通过CTS(通用类型系统),实现严格的类型和代码验证,来增强代码鲁棒性。 CTS 确保所有托管代码是自我描述的。 各种Microsoft编译器和第三方语言编译器都可生成符合CTS的托管代码。 这意味着,托管代码可在严格实施类型保真和类型安全的同时,使用其他托管类型和实例。 --- CLS是公共语言定义(Common Language Specification) 公共语言运行库支持的语言功能的子集,包括几种面向对象的编程语言的通用功能。符合 CLS 的组件和工具能够保证与其他符合 CLS 的组件和工具交互操作。 -- CLI又叫作公共语言基础架构(Common Language Infrastructure) CLI是一种规范,CLR是对规范的一个实现 -- BCL叫作基础类库(Base Class Library) BCL是一个公共编程框架,称为基类库,所有语言的开发者都能利用它 ---- FCL叫作框架类库(Framework Class Library) FCL提供了大粒度的编程框架,它是针对不同应用设计的框架 ,FCL大部分实现都引用了BCL,例如我们常说的开发框架:ASP.NET、MVC、WCF和WPF等等,提供了针对不同层面的编程框架 。 --- 托管代码就是Visual Basic .NET和C#编译器编译出来的代码,托管代码在公共语言运行库(CLR)中运行 非托管代码是运行在公共语言运行库环境(CLR)的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务
托管和非托管的区别 1、托管代码是一种中间语言,运行在CLR上; 非托管代码被编译为机器码,运行在机器上。 2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容; 非托管代码依赖于平台和语言。 3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作; 非托管代码需要自己提供安全检测、垃圾回收等操作。
非托管代码的使用方法 unsafe是非托管代码的关键字 可以用来修饰类、类的成员函数、类的全局变量,但不能用来修饰类成员函数内的局部变量 运行unsafe ,需要设置: 单击“配置属性”文件夹。
单击“生成”属性页。
修改“允许不安全代码块”属性
非托管代码的语法是 unsafe static void FastCopy(byte[] src, byte[] dst, int count) { //可以使用指针 }
Unsafe { //可以使用指针 } --- GC(Garbage Collector)如其名,就是垃圾收集,这里仅就内存而言。Garbage Collector(垃圾收集器,在不至于混淆的情况下也成为GC)以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。
GC 类 控制系统垃圾回收器(一种自动回收未使用内存的服务)。 GC 会跟踪托管内存中分配的对象,并且定期执行垃圾回收.当使用内存不能满足内容请求时,GC回收会自动进行,也可以使用Collect方法强制进行垃圾回收 .NET的GC机制两个问题: 首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。 第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性 GC的好处 { 为什么要使用GC呢?也可以说是为什么要使用内存自动管理?有下面的几个原因: l 提高了软件开发的抽象度; l 程序员可以将精力集中在实际的问题上而不用分心来管理内存的问题; l 可以使模块的接口更加的清晰,减小模块间的偶合; l 大大减少了内存人为管理不当所带来的Bug; l 使内存管理更加高效。 总的说来就是GC可以使程序员可以从复杂的内存问题中摆脱出来,从而提高了软件开发的速度、质量和安全性。
}
GC.Collect()方法,作用是强制进行垃圾回收,一般用于特殊情况 ---- 元数据:是一种二进制信息 元数据存储以下信息: 程序集的说明 类型的说明 属性 ----- .NET Framework 编译时和运行时 运行流程就是 源码->编译器->程序集->JIT编译器(就是公共语言运行库CLR)->本机代码->操作系统服务 -- 程序集指的是DLL、EXE文件 是包含一个或者多个类型定义文件和资源文件的集合。在程序集包含的所有文件中,有一个文件用于 保存清单。 (清单是元数据部分中一组数据表的集合,其中包含了程序集中一部分文件的名称,描述了程序集的 版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件)。
由编译器编译得到的,供CLR进一步编译执行的那个中间产物,在WINDOWS系统中,它一般表现为·dll或者是·exe的格式,但是要注意,它们跟普通意义上的WIN32可执行程序是完全不同的东西,程序集必须依靠CLR才能顺利执行。
:程序集的说明 -- JIT (Just in time)即时编译器
|