![91228873b04b99ad06a00159799de813.png](https://i-blog.csdnimg.cn/blog_migrate/24bc3150dcff71e48e3079647b3df725.jpeg)
+C# .Net CLR IL
C#是编程语言,有自己的语法规则、编译器。
.Net 是一个平台,可以开发、部署、执行分布式的引用程序
CLR将IL语言在运行时翻译为CPU指令
IL是Microsoft中间语言,可以由多种语言生成,达到跨语言的效果。
+CLR
CommonLanguageRuntime:是一个可由多种编程语言使用的“运行时”。我们将编写好的C#或者其他语言的脚本,使用编译器编译为CLR使用的托管模块(下面解释),然后执行里面的代码时,CLR将上面的中间语言编译成本机的CPU指令(运行时编译),稍后会缓存第一次编译的CPU指令,之后直接调用。
+托管模块
1、PE头(PE:PortableExecutable可移植执行体):标记32位还是64位使用,文件类型时GUI还是DLL,文件生成时间,CPU代码相关信息。构成程序集的文件、plublic类型、程序集关联的资源和文件
2、CLR头:版本,一些标志,入口Main方法
3、元数据:两个(种)表,源代码定义的类型和成员;源代码引用的类型和成员
4、IL中间语言代码:编译源代码生成的代码,运行时CLR将IL编译成本机CPU指令
注意元数据表与IL应是关联的,编译器同时生成元数据表和IL,然后同时嵌入托管模块,因此始终时关联的
编译器默认将生成的托管模块转换成程序集
+元数据作用明显
1、使用vs写代码时,解析元数据可以告诉一个类型的方法、属性、事件、字段、参数。
2、不同机器上字段序列化,然后反序列化。
3、元数据知道哪个对象引用了哪些对象,方便垃圾回收器工作。
+PDB调试
编译源文件时可以选择打开 /debug(+/full/pdbonly) 开关,生成 ProgramDatabase文件。PDB文件帮助调试器查找局部变量并将IL指令映射到源代码。
+运行时编译CPU指令好处
1、JIT编译器能判断应用程序是不是可以生成使用Pentium4支持的特殊指令。
2、生成的代码对主机进行优化
+核心功能
内存管理,程序集加载、安全性、异常处理、线程同步
+通用类型系统CommonTypeSystem(CTS)
CLR围绕类型展开,类型向应用程序和其他类型公开功能。通过类型,用一种编程语言写的代码能与另一种语言写的代码沟通。所以有一个正式的规范来面熟类型的定义和行为。
一个类型可以包含一个或多个成员:
1、字段Field:数据变量,根据名称和类型区分
2、方法Method:函数,有一个名称、一个签名(指定参数数量、类型,方法是否有返回值、返回值类型)、一个或多个修饰符。
3、属性Property:getter、setter
4、事件Event
CTS还规定了访问权限
CTS规定所有类型必须从预定义的System.Object类型继承。可以实现:1、比较相等性;2、获取实例的哈希码;3、查询实例的真正类型;4、执行浅拷贝;5、tostring
生成、打包、部署和管理应用程序及类型
+编译一个应用程序
1、将代码放到一个源码文件中,C#是.cs文件
2、csc.exe /out:Program.exe /t:exe /r:MsCorLib.dll Program.cs。首先指出编译Program.cs文件,/r是reference,告诉编译器再MSCorLib.dll查找需要用的外部类型。/t是type,windows支持三种应用程序:1、控制台用户界面应用程序exe;2、图形用户界面winexe;3、WindowsStore应用appcontainerexe。
+元数据中的元数据定义表
1、ModuleDef:模块包含的文件名和扩展名及唯一ID
2、TypeDef:类型名称、基类型、一些标志(public、abstract等)、一些索引(拥有的method、field、property、event)
3、MethodDef:方法名称、一些标志、签名、该方法在IL代码中的偏移量、参数信息
4、FieldDef:标志、类型、名称
5、ParamDefÿ