.net framework的组成及跨平台的实现
一、.net framework的组成
- .net framework由以下两部分构成
- common language runtime(CLR)
- 公共语言的运行环境,相当于java中的虚拟机
- 为托管程序提供执行环境,内存管理、垃圾回收等
- framework class library(FCL)
- 由以下两部分构成
- basic class library(BCL)
- 基础类库
- 作为一个不可分割的整体,为所有WPF、WCF、Windows Forms、Asp.net等框架提供基础类型
- AppModel
- ASP.NET、Windows Forms等
- basic class library(BCL)
- 由以下两部分构成
- common language runtime(CLR)
二、.net framework的问题
- 同一设备平台下BCL大而全
- BCL需要为所有托管程序提供基础功能的支持
- 不可分割
- 核心功能都在一个程序集中,必须全部加载进内存,即使很多功能用不上
- 不同设备平台下BCL各自独立
- 不同设备平台,.net framework不光在AppModel层有差异,在BCL和CLR层面也有差异
三、.net framework实现跨语言和跨平台
- Common Language Infrastructure(CLI)
- Common Language
- 解决各种开发语言的兼容性
- 方式:为每种高级开发语言配备一个编译器,将其编译成中间语言
- Infrastructure
- 运行时环境
- 弥补不同设备平台之间执行方式的差异
- 方式:为每个设备平台配备一个虚拟机,通过即时编译,将中间语言编译为适用于设备平台的机器语言
- Common Language
四、.net framework下的跨平台代码复用
2.1 源代码复用
- 文件链接
- 文件在同一物理位置,被不同的项目所引用
2.2 程序集复用
2.2.1 托管模块与程序集
- 托管模块
- 一种编程语言编译后生成,包括IL代码和元数据
- 程序集
- 多个托管模块构成
- 清单文件包含在某个托管模块中,能够标识出程序集中包含的资源以及引用的外部程序集
- 清单文件中记载的外部程序集是编译时引用的程序集
2.2.2 CLR加载程序集的规则
- 清单文件中记载的外部程序集是CLR加载程序集的依据
- 编译时引用强签名程序集
- CLR需要加载与清单文件记载的文件名、版本号、公钥令牌相同的程序集,否则报错
- 编译时引用未签名程序集
- CLR需要加载与清单文件记载的文件名、版本号相同的程序集
- 例外,编译时引用了低版本.net framework的基础程序集,可以直接在高版本的CLR中运行
- 编译时引用强签名程序集
- 类型转移
- API在低版本的.net framework中定义在某个程序集中,在高版本的.net framework又定义在另一个程序集中
- 高版本的.net framework为了向后兼容,会保留原来的空壳,并重定向到新的位置,即类型转移特性
2.2.3 Retargetable程序集
- 编译时引用强签名程序集,要求运行时程序集的文件名、版本号、公钥令牌相同
- 使用Retargetable标记后,强签名程序集的匹配规则会变为只匹配文件名
- 编译时引用Retargetable标记的程序集
- 但是只适用于.net framework提供的基础程序集
2.2.4 类型转移
- API在低版本的程序集中定义在某个程序集中,在高版本的程序集又定义在另一个程序集中
- 使用类型转移特性标记后,可以在高版本的程序集中保留原来的空壳,并重定向到新的位置,实现向后兼容
2.3 PCL项目
- 依据
- 不同平台框架的API存在交集,建立在交集之上的程序集可以运行在这些平台之中
- 微软枚举了各种平台框架排列组合的情况,生成了对应的Profile,在创建PCL项目之前,只要选择对应的Profile,就能实现有限的跨平台能力
- 所有的Profile都是Retargetable程序集
- 编译与运行时环境的不一致,可以通过Retargetable和类型转移解决
- 跨平台可以通过Profile解决