CLR执行模型
1:首先先明确CLR的概念:
CLR(Common Language Runtime):公共语言运行时,是一个可由多种编程语言使用的"运行时";
在运行时,CLR根本不关心开发人员用的是哪一种语言来变写代码,它只关注语言是否是面向CLR(面向运行时)的.
2:CLR的核心功能包括:
内存管理、程序集加载、安全性、异常处理和线程同步。
3:如图:
无论是用的是哪一种编译器,结果都是一个托管模块(managed module),托管代码时一个标准的32位/64位Microsoft Windows可移植执行体(PE32/PE32+)文件.
本地代码编译器,生成的是面向特定CPU架构(X86,X64或IA64)的代码.相反,每个面向CLR的编译器生成的都是IL(中间语言)代码,IL代码也被称为托管代码.
除了生成IL,面向CLR的每个编译器还要在每个托管模块中生成完整的元数据,元数据是一组数据表.其中一些数据表描述了模块中定义的内容,元数据其实就是编译器所生成的一些完整数据.
4:CLR实际是不和模块一起工作的,它是和程序集一起工作的.
5:加载公共语言运行时
我们生成的每个程序集既可以是一个可执行应用程序,也可以是一个DLL,最终是由CLR管理这些程序集中的代码的执行,所以必须在运行机器中安装.NET FrameWork.WIndows一些版本系统已经内置打包了好了.NET FrameWork.不过需要我们手动的开启.可以在控制面板中进行启动在此就不做详细解释.作为开发人员,这是不需要解释的.
6:执行程序集的代码
执行一个方法,第一必须把它的IL转换为本地CPU指令,这是CLR的JIT的本质.
如图:
就在Main方法执行之前,CLR会检测Main的代码引用的所有的类型,这导致CLR分配一个内部数据结构,用于管理对所引用的类型的访问.
一个方法只有在首次调用时,才会造成一些性能损失,以后对该方法的所有调用都以本地代码的形式全速运行.无需重新验证IL并把它编译成本地代码.
JIT编译器将本地CPU指令存储到动态内存中,一旦应用程序终止,编译好的代码也会被丢弃,所以,如果将来再次运行应用程序,或者同时启动应用程序的两个实例,JIT编译器必须再次将IL编译成本地指令.
6:IL验证.
IL是基于栈的,所以它的所有指令都要将操作数压入(push)一个执行栈,并从栈弹出(POP)结果.由于IL没有提供操作寄存器的指令,所以人们可以很容易地创建新的语言和编译器,生成CLR的代码.IL指令是无类型的.IL的好处在于是健壮和安全的,因为它编译为CPU指令,CPU会进行验证是否安全.
7:Framework类库
FCL(Framework Class Library):是一组DLL程序集的统称,其中含有很多的类型定义,每个类型都公开了一些功能.
Web服务:Web service 技术或者WCF技术,可以非常简单的处理通过Internet发送的消息.
Web窗体应用程序:Web Form
Windows应用程序:开发windows GUI应用程序.
富Internet应用程序:Silverlight技术,可以构建通过Internet来部署的GUI应用程序.这种程序能在Web浏览器的内部或外部运行,还可以在非Windows操作系统与移动设备傻瓜运行.
Window控制台:提供简单快捷方便的方式,生成应用程序,编译器.
Window服务:可以通过.NET FrameWork 生成"服务"应用程序.
数据库存储过程:编写存储过程
组件库:.NET FrameWord允许生成独立的程序集(组件),其中包含的类型可以轻松集成到任意的程序库中.