导航

.Net 本质论读书笔记(二)关于 Assembly

Posted on 2011-10-07 21:52  雨夜孤鹤  阅读(346)  评论(0编辑  收藏  举报

前文讲过, Modules 是.net 中程序存储的最小单位。而 Assembly是程序的最小部属单位,一个 Assembly 由一个或多个 Modules 组成。Assembly 是一个逻辑概念,而Module是一个物理概念,是实际存在的 byte 流。Assembly 实际上是对一个或几个 module 的引用。

上面介绍了 assembly 的基本概念。学习一个东西应该从他的原理来入手这样才能有所收获,所以为什么 .net 要设计出这样的一个概念呢?

原因主要有两个:因为当一个程序由几部分组成的时候,当load module的时候就可以先load初始化的部分,而其他部分可以当需要的时候再load出来。这样的好处显而易见,也是我们编程的时候常用到的一种思想。还有一个原因就是对多语言的支持,我们知道,c# 和 c++ 对业务层和系统级别的支持各有千秋。而如果我们把两种语言写成的 module 放在一个 assembly 后,可以对他们进行统一部署,卸载,升级等。

每个module 里面都会需要一些定义在其他 assembly 的类型(比如最常见的 mscorlib就用来定义 System.Object and System.String)。所以每个 module 里都有一个列表用来记录这些 assembly的引用,这些引用都是用逻辑地址来记录的,在运行的时候又 CLR 将这些逻辑地址转化成物理地址。

如前文所说,assembly 是部署运行的最小单元,其中包括很多 module 模块。那么,一个assembly是怎么找到它所包含的 module 呢?原来,每个assembly都有一个额外的module, 这个module包含了一个类似于目录的列表,用来记录这个 assembly 里需要的类型定义文件和源代码文件。只有这个 module 可以被直接load,其他的只能通过load记录模块后才能被load。

其实我们常见的 private,protected,public,internal等访问控制符都是和 assebly,module相关才能更好地理解。下面对以上几个控制符分别说明:

public : 所在 assembly 和外部 assembly 都可以被访问。

internal:只能被属于所在 assembly 的 module 访问。

private:只能被本类型内部的成员访问。(这是另一个限定体系)

protected:能被本类型以及派生类型内部成员访问。

protected internal:可以被派生类或者本 assembly 内成员访问。