CLR_VIA_C# 学习笔记(1)

来源:互联网 发布:淘宝上下架是什么意思 编辑:程序博客网 时间:2024/05/24 01:57

CLR 介绍

从Code 到Module

 

 

C# 代码被编译器拿去编译生成IL,32位的生成PE32 Header,64位 生成PE32+ Header. 还有CLR Header ,Metadata , IL。

 

PE32 + ,PE32 Header :包含目标平台是64还是32位系统,文件类型(GUI,CUI,DLL)

CLR Header:CLR 版本,模块大小,资源,签名等

Metadata:类型表,类成员定义等

IL: 除Metadata定义外的代码逻辑,一些方法等,运行期CLR会调用JIT 编译器编译IL为CPU指令。

Metadata其它用途:

1.      Metadata打包了所有类定义(好比C/C++中的头文件),并和IL最终编译为Assembly(dll)

2.      Metadata为visual studio提供智能感知的数据来源

3.      GC根据metadata的定义决定对象的生命周期

 

 

 

 

从Managed Module到Assembly

 

 

 

完成了从source code到module的编译后,第二次编译会把多个module文件编译,用assemblylinker链接构成Assembly文件,就是dll或exe。

 

 

 

 

 

 

 

 

运行EXE(加载dll)的过程


 

 

 

 

JIT执行过程

方法执行前,CLR会加载main函数中引用到的类型以及方法,并为其分配一个初始地址,在JIT编译过程,在生成CPU指令之后,修改这个地址。

 

 

 

 

 

 

第一步 : 生成CPU指令保存在堆栈

 

第二步:修改方法地址为保存CPU指令的地址

 

 

 


注意:JIT的过程只在第一次call方法时会触发,生成了nativeinstruction之后,下次在call 方法,就会直接找到生成好的CPU指令了。

JIT 的其他功能:

1.      根据CPU类型,生成效率较高的指令(例如奔腾和AMD)

2.      在程序运行时,不断的对IL调优

3.      在CPU级别的一些代码,直接生成结果,从而优化IL。例如if(numberOfCpu > 1),JIT如果遇到多核环境会生成true,单核生成false

 

Optimize+

当软件版本release时,有些debug时生成的IL是不需要的,因此可以选择使用编译开关(optimize+),visual studio 选择release就使用了这个开关。会带来以下好处:

1.      移除NOP(No Operation) 指令 ,主要是一些断点

2.      IL文件会更小,减少workingset

3.      不会生成pdb调试文件

PDB文件是debugger用来map IL到源代码,调试时才使用。

 

NGen.exe

用途:可以预先把IL生成为CPU指令,这样在运行时,CLR找到NGEN.EXE生成的文件,就不会触发JIT执行动态编译,而是直接运行生成好的指令文件。

好处:

1.      对于一个assembly被多个程序共享同时运行的情况,workingset会被减少

2.      提高启动时间

弊端:

1.      会享受不到一切JIT的提供的代码优化。

2.      如果选择NGen.exe , 要实时与IL编译时 的以下参数同步:

a.      CLR版本

b.     CPU类型

c.      Windows版本

d.     引用Assembly的版本号

 

 

进程和appdomain

在CLR中,每个application可以access的内存在App Domain中,一个进程可以包含多个appdomain。App domain 可以共享进程中的资源。

 

 

 

FCL , CTS , CLS

Framework Class Library

.NetFramework提供了大量的类库简化编程,有Web,Service,GUI, Console ,Windows Service , Library 等等方面。在此就不一一列举了。

 

Common Type System

当基于.NET需要多语言混合编程时,就需要考虑CTS 定义的一些规则了,需要考虑.NET平台的其他语言的能力。例如C++支持多继承,可是混合编程的编译环境会触发编译错误。

 

Common LanguageSpecification

和CTS一样,在基于.NET进行多语言混合编程时,也要考虑其他语言的能力,例如VB.net中不区分大小写。

给assembly加上Attribute :[assembly:CLSCompliant(true)] , 就告诉编译器,这个组件的target是多语言环境,代码中可以使用的定义,语法,能力,都是基于.NET平台中所有语言都不冲突的,在CLS允许范围内。

 

 

1 0
原创粉丝点击