.Net 本质论读书笔记(一)关于 Modules
时间:2011-05-26 来源:雨夜孤鹤
说明:本系列内容是《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.NET | C++ | 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 不是一回事】。