通用语言运行时
CLR提供的好几样东西,用来创建和运行这种特殊代码,最基础的东西是一套可被基于CLR的语言所使用的标准类型,以及一个标准的元数据格式,那是“以标准类型而建造的软件”的相关信息
定义一门新的编程语言的时候通常的做法是:先定义诸如关键语义(semantics)的抽象性,然后才是语法
如果只定义语义不定义语法,把语义抽象性够一般化,他就可以被用于不同的编程语言上,这是CLR做的事,CLR并没有定义特定的语法或者关键字,只是定义了一套通用类型,他们可以用于许多语言的语法上,每一种语言都可以自由定义它搜希望的任何语法,但如果某个语言点击与CLR上,它将至少使用CTS定义的一部分类型。
CTS(通用类型系统)
CTS定义的一整套类型在CLR中居核心位置
在CTR所定义的每一个类型,如果不是个引用类型,就是个值类型。
引用类型直接继承与object类,
值类型直接继承与ValueType,后者又继承于object类。
内存的分配方式
在托管代码中,有两种主要的内存分配方式:分配于CLR所管理的堆栈(stack)上面,或者分配于CLR所管理的堆(heap)上面
分配与堆栈上面的变量通常是“某个方法被调用”或是当“某运行中的方法进行创建出来的”,无论哪一种情况,堆栈变量所使用的内存会在器创建者(某个方法)返回时被自动释放。
至于分配在堆中的变量,并不会在其创建者(某个方法)结束的时候自动释放内存,它们的内存将通过一个垃圾回收机制的过程处理而被释放。
值类型和引用类型之间的一个根本差异是:前者的实例被分配与堆栈,后者则只不过是一个谓语堆栈的引用,指向(代表)一个分配于堆的实例。
引用类型reference type包括:
方法(methods)
字段(field)
事件(event)
属性(properties)
嵌套类型(nested types)
类型成员(type members)
类(class)
接口(interface)
组数(array)
委托(delegate)
将值类型转换为引用类型-------装箱,反之,则是拆箱
编译托管代码
编译基础CLR的语言编写的源代码是,生成两样东西,一个是MSIL(微软中间语言)表达指令,一是元数据
为什么需要MSIL
1提高语言的可移植性
2提高语言的安全性和可靠性
(它不像二进制代码可包含任意内存地址的引用,被装载至内存的时候,MSIL代码可进行类型的安全校验,这使得某些错误很大一部分不再具有攻击的可能)
元数据
托管代码编译以后会生成元数据,例如一个原始程序编译以后出除了每个方法以后的代码,这份文件还包含“描述这些类及定义于此文件中的任何其他类型”的元数据,当这个文件被加载时,这些类型被自动装入内存,于是运行程序便可以于运行期访问到元数据,也可以直接从包含元数据的文件中读取他们,这么一来即便代码没有加载到内存中,依然可以获取这些信息,读取元数据的过程就是广为人知的反射reflection
元数据中包含了:
类型的名称
类型的可见性
类型继承与什么类型
类型中实现的接口
类型中实现的方法
类型中所暴露的任何属性
类型所提供的任何事件
程序集(这部分引用自百度—总结的还可以)
1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合。
2.程序集是组件复用,以及实施安全策略和版本策略的最小单位。
3.程序集是包含一个或者多个类型定义文件和资源文件的集合。在程序集包含的所有文件中,有一个文件用于 保存清单。(清单是元数据部分中一组数据表的集合,其中包含了程序集中一部分文件的名称,描述了程序集的版本,语言文化,发布者,共有导出类型,以及组成该程序集的所有文件)。
4、在编译应用程序中,所创建的CIL代码存储在一个程序集中,程序集包括可执行的应用程序文件(.exe扩展名文件)和其他应用程序使用的库(.dll扩展名文件)。[1]
作为一个单元进行版本控制和部署的一个或多个文件的集合。程序集是.NETFramework应用程序的主要构造块。所有托管类型和资源都包含在某个程序集内,并被标记为只能在该程序集的内部访问,或者被标记为可以从其他程序集中的代码访问。程序集在安全方面也起着重要作用。代码访问安全系统使用程序集信息来确定为程序集中的代码授予的权限集。
程序集是.NETFramework编程的基本组成部分
组成部分:
1.程序集清单,包含描述该程序集中各元素彼此如何关联的数据集合,还包含指定该程序集的版本要求和安全标识所需的所有元数据,以及定义该程序集的范围和解析对资源和类的应用所需的全部元数据。
2.元数据,提供有关程序集中定义的类型的信息,包括类型的名称,可见性,基类和类型所实现的接口。注意:程序集清单和元数据说明了程序集是自我描述的。
3.实现这些类型的MSIL代码。
执行功能
1.包含公共语言运行库执行的代码。如果可移植可执行 (PE) 文件没有相关联的程序集清单,则将不执行该文件中的Microsoft中间语言(MSIL)代码。请注意,每个程序集只能有一个入口点(即DllMain、WinMain或 Main)。
程序集形成安全边界。程序集就是在其中请求和授予权限的单元。有关应用于程序集的安全边界的更多信息,请参见程序集安全注意事项。
2.程序集形成类型边界。每一类型的标识均包括该类型所驻留的程序集的名称。在一个程序集范围内加载的 MyType 类型不同于在其他程序集范围内加载的 MyType 类型。
3.程序集形成引用范围边界。程序集的清单包含用于解析类型和满足资源请求的程序集元数据。它指定在该程序集之外公开的类型和资源。该清单还枚举它所依赖的其他程序集。
4.程序集形成版本边界。程序集是公共语言运行库中最小的可版本化单元,同一程序集中的所有类型和资源均会被版本化为一个单元。程序集的清单描述您为任何依赖项程序集所指定的版本依赖性。
5.程序集形成部署单元。当一个应用程序启动时,只有该应用程序最初调用的程序集必须存在。其他程序集(例如本地化资源和包含实用工具类的程序集)可以按需检索。这就使应用程序在第一次下载时保持精简。
6.程序集是支持泾渭执行的单元。有关运行多个程序集版本的更多信息,请参见程序集和泾渭(side-by-side) 执行。
还有一些关于安全的东东实在比较难理解,日后若有机会当黑客再详细研究吧···