导航

.Net 本质论读书笔记(一)关于 Modules

Posted on 2011-05-26 00:51  雨夜孤鹤  阅读(262)  评论(0编辑  收藏  举报

说明:本系列内容是《Essential .Net》一书中的文章的翻译,并且添加了一下个人拙见与疑问。意在抛砖引玉,与大家分享经验,交流学习。

我们为CLR(公共语言运行时)编写的程序是以 Modules 为存储单元的。一个 Modules 是一种存储在本地的字节流文件。

接下来剖析一下 CLR Module 的格式:总体来讲,CLR Module 格式是 PE 文件 格式的扩展应用,即在通常的PE文件格式基础上进行了一些扩展。与此同时,CLR Module 本身也是一个可以被 LoadLibrary 调用的 Win32 模块【也许是为了与其他模块的兼容性】。虽然沿用了PE 文件格式,但 CLR Module 并没有太多的沿用 PE 文件格式所提供的功能【这也证实了设计成这种格式是为了与其他程序的兼容性与交互性吧】。

CLR Module 的主要有三种内容:code,metadata,resources ,这些内容主要存储在 .text 区域。下面分别对这三种内容进行一下简要说明:

  • code : 以 CIR 或 本地机器码【现在理解是JIT编译后的结果】。
  • Metadata:描述 Module 中定义的类型,包括名称,继承关系,方法签名等。
  • Resources:存储字符串,bitmap,以及其他一些除了code以外的资源。

CLR Module 的文件格式是很固定并且很容易文档化的,但是很少有人直接看到过CLR文件内容的格式。即使我们想动态产生CLR Module 也只需用使用IMetaDataEmit( 被C++用来产生Module) 或者 System.RelectionEmit(C#或VB.net使用)。

C#编译器,VB 编译器,C++ 编译器都可以将源代码转化成 CLR 模块。这些编译器使用命令行选择参数来控制产生哪种 Module。 

C#/VB.NETC++Directly Loadable?Runnable from Shell?Access to Console?
/t:exe /CLR Yes Yes Always
/t:winexe /CLR /link /subsystem:windows Yes Yes Never
/t:library /CLR /LD Yes No Host-dependent
/t:module /CLR:NOASSEMBLY /LD No No Host-dependent

解释:/t:module 参数产生一个以一个.netmodule 为后缀名的原始模块,这种模块本身不能被直接部署,开发人员必须将 module 附加到 assembly 上才能被部署。【程序集是执行的最小模块,.netmodule 应该是组成程序集的部分】。相比之下,/t:library 选项产生的是一种允许开发人员直接部署该模块的 metadata【与组成 Module 的三种类型中的 metadata 不是一回事】。