俺的回收站

架构分析 解释编译原理
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模块,程序集和AppDomain

Posted on 2006-12-14 15:51  Riceball LEE  阅读(873)  评论(0编辑  收藏  举报

模块(Module)类似于以前的单元,用于分割不同的类和类型,以及资源(resource, 资源记录就是字符串,图象以
及其它数据,他们只在需要的时候才会被调入内存)。类型的Meta信息也是模块的一部分。

既然模块种包含类型的Meta信息,类型检查系统就可以联合静态和动态技术。当IL运行的时候,执行环境能得知
所有变量参数的类型Meta信息,自然就能执行运行时刻的类型检查——这被称之为 reflection(它的含义为解释
自描述类型,类型的影子)。

多个模块文件可以被链接成一个程序集(assembly)。在程序集上多了一个清单(manifest),用来描述该程序集
以及模块的列表,一个主入口,导出的类型定义列表(私有模块中公开的类型)。这份清单被放在一个模块上,
在该模块上的公开的类型不会出现在导出类型定义列表上!

程序集是CLI发布管理(deployment managed)的单位。程序集是可重用的软件组件。程序集甚至能动态绑定调用代
码。
  * 程序集是独立的软件组件子集,无须重新编译。
  * 程序集是定制软件
  * 程序集能被独立发布
  * 程序集导出的API能和其它组件完美的交互。

程序集在文件系统中是用PE(portable executable)格式存放。

一个程序集将被加载到一个Application Domain(AppDomain)中执行? 外部引用的其它程序集将在同样同一
AppDomain下运行。换句话说,AppDomain 将程序集聚集在一起,实现最终功能。
每一个AppDomain定义了一个由CLI执行引擎管理的地址空间。所有的地址引用将确保实在同一个AppDomain中。
CLI地址空间是有层次的:AppDomain 能被加载入一个CLI地址空间。
CLI地址空间可以被概略的认为是OS中的进程地址空间(至少在Rotor CLI中是这样)。每一个地址空间都有明
确的地址边界。

每一个CLI地址空间可以包含多个AppDomain: 其中一个AppDomain就是系统程序集,另一个AppDomain包含与其
他与AppDomain共享的程序集。只有CLI管理器(the supervision of the CLI)才能跨越AppDomain的地址空间访
问进行交互。AppDomain之间的交互通讯是通过 Remoting 类型检查机制完成。同样的机制被用于跨越地址空间,
如接口和OS IPC.

模块,程序集,AppDomain和地址空间(address space)的关系是,模块是编译器建立的最小的单元文件,由一
个或n个模块组成程序集,程序集是进行分发的最小单元文件,程序集能组合在一个AppDomain下执行。多个
AppDomain能在单个地址空间下执行。


注:
Common Language Infrastructure (CLI) 通用语言基础组织