第二章
通用语言运行层
1
3
Hello World
?输入如下代码:
?using System;
? class hello
? {
? static void Main()
? {
? string str;
? Console.WriteLine("hello");
? }
? }
4
Hello World
?
两种运行方式
5
Hello World
6
Hello World
?using System 语句表示导入System 命名空间–System.Console.WriteLine("hello")
?class class hello
hello ?{
?}
– C#要求其程序中的每一个元素都要属于一个类。
7
第二章 CLR
?开发托管代码:通用类型系统?编译托管代码:MSIL 和元数据
?组织托管代码:程序集(Assembly )?运行托管代码
8
编译托管代码
?概述
?MSIL
?元数据
9
编译托管代码-概述
?托管代码经过编译会生成?MSIL (Microsoft Intermediate Language )
–微软中间语言
?元数据(metadata )
?MSIL 和元数据包含于DLL 或EXE 文件中
10
编译托管代码-
概述
11
编译托管代码-MSIL ?MSIL 是一种介于高级语言和基于Intel 的汇编语言的伪汇编语言,是一组可以有效地转换为本机代码且独立于CPU 的指令。
?MSIL 包括用于加载、存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算、控制流、直接内存访问、异常处理和其他操作的指令。要使代码可运行,必须先将 MSIL 转换为特定于 CPU 的代码,这通常是通过实时 (JIT) 编译器来完成的。由于公共语言运行库为它支持的每种计算机结构都提供了一种或多种 JIT 编译器,因此同一组 MSIL 可以在所支持的任何结构上 JIT 编译和运行
12
编译托管代码-MSIL ?MSIL 指令:
–add :将堆栈最顶端的两个值相加,并将结果压回堆栈顶端。
–box :将一个值类型装换为一个引用类型,也就是说将这个值“装箱”。
–call :调用某方法。
–ldfld :将某个对象中的一个指定的字段加载到堆栈上。
–ldobj :将一个值类型的值拷贝到堆栈上。–unbox :将一个被装箱的值类型转换为其原始形式。
14
编译托管代码-MSIL ?将主函数反汇编成MSIL
指令
15
编译托管代码-元数据?当编译器产生 MSIL 时,它也产生元数据–元数据描述由CLR 管理的每个元素的信息:程序集、可加载文件、类型、方法等等。它可以包括调试和垃圾回收所需要的信息,以及安全属性、封送数据、扩展类和成员定义、版本绑定,以及运行库所需要的其他信息。
–当执行代码时,运行库将元数据加载到内存中,并引用它来发现有关代码的类、成员、继承等信息。
16
编译托管代码-元数据?
元数据是一个二进制数据块,由几个表构成。这些表分为三个类别:定义表(definiton talbe )、引用表(reference table)和清单表(mainfest table)。?
常用元数据定义表(编译器编译源代码时,代码定义的任何一样东西都会导致定义表中的表中创建一个记录项):?
ModuleDef 总是包含一个用于标示模块的记录项。?
TypeDef 模块中定义的每个类型都在这个定义表中有一个对应的记录项。?
MethodDef 模块中定义的每个方法都在这个定义表中有一个对应的记录项。?
FieldDef 模块中定义的每个字段都在这个定义表中有一个对应的记录项?
ParamDef 模块中定义的每个参数都在这个定义表中有一个对应的记录项?
PropertyDef 模块中定义的每个属性都在这个定义表中有一个对应的记录项?EventDef 模块中定义的每个事件都在这个定义表中有一个对应的记录项
17
编译托管代码-元数据?常用的引用元数据表:
? AssemblyRef 模块中引用的每个程序集在这个表中都有一个对应的记录项
? ModuleRef 模块引用的每个类型可能是由别的PE 模块实现的,所有那些模块在这个表都有一个记录项? TypeDef 模块引用的每个类型在这个表中都有一个对应的记录项
? MemberRef 模块引用的每个成员都在这个表中有一个对应的记录项
18编译托管代码-元数据?
清单元数据表:? AssemblyDef 如果该模块标示的是一个程序集,就在这个元数据表中包含单个记录项。该记录项列出了程序集名称(不含路径和扩展名)、版本(major,minor,build 和revision)、语言文化(culture)、一些标志(flag)、哈希算法以及发布者的公钥。 ? FileDef 作为程序集一部分的每个PE 文件和资源文件在这个表中都有一个对应的记录项。
? MainifestResourceDef 作为程序集一部分的每个资源在这个表中都有一个对应的记录项
?
ExportedTypesDef 从程序集的所有PE 模块中导出的每个public 类型中在这个表中都有一个对应的记录项。
19
编译托管代码-元数据?元数据还包括特性(Attribute )值及自定义特性等信息–CLR 允许添加类似关键字的描述性声明(称为特性)来批注编程元素,如类型、字段、方法和属性。特性与.NET Framework 文件的元数据一起保存,并且可用于向运行库描述代码或影响应用程序的运行库行为。.NET Framework 提供了许多有用的特性,但也可以设计和部署自己的特性。
20
编译托管代码-
元数据