Essential .NET 读书笔记--转
一.前言
去年的这个时候读了Don Box的《Essential .NET Volume 1: CLR》(《.NET 本质论 卷一:CLR》),当时囫囵吞枣似的匆匆读完,没有认真咀嚼大师的思想,有点暴殓天物的感觉。今日又在图书馆拿出这本书,心中有很多体会,也许就像他本人所说,Don Box的书不应该只读一遍的。
在这篇读书笔记中,我将原书的中一些重点摘抄下来,同时对书中的一些观点也会提出自己的思考。好了,废话不说,让我们开始吧。(本人才疏学浅,难免有许多疏忽和错误之处,希望大家能进行指正)
二.第一章 CLR是一个更好的COM
1.组件技术强调程序之间的约定(contract),COM之间的组件约定是基于二进制的,同时没有一种标准的描述形式。(受到现实环境所累)
2.COM为什么消亡了?COM是一个编程模型,但是支持它的平台技术太薄弱了,最终使得COM变成了一个理念或编程准则,因此COM时代终结了。
3..NET的3个主要的组成部分:CLR,公共类库,ASP.NET。
4..NET Framework包括2个核心的集成技术:[1] CLR(虚拟机,作为托管代码的宿主,将他们集成到一个单独的OS进程中)[2] Web Services (异构系统集成)
5.CLI包括了:CTS, CIL, 元数据和底层文件。CLI已经提交给了ECMA(C#好像也已经提交给了ECMA了吧,版本是1.0 还是2.0 ?)。目前的CLI实现有:MS CLR和Mono。
6.CLR本质是一个虚拟运行环境,一个加载器,它将你的组件加载入一个OS进程中。
7.CLR是组件软件的一个发展阶段,所有组件之间的约定都是基于逻辑结构的。
8.CLR和Web Services强调组件之间的强类型协定,用来描述组件之间的关系与依赖。有2种关键概念为上述目标提供了基础:[1] 元数据(机器可读,可扩展) [2] 虚拟化。
9.CLR中组件之间的约定具有完全规范的格式(元数据),同时约定根据的是类型的逻辑结构(物理结构等到首次被运行时加载的时候再确定)。这2点与COM的约定完全不同,是对它的重要改进。
10.CLR是类型安全的,一切都是类型,对象或值。这些类型在托管代码在CLR上运行的时候依然存在,并可以被CLR或其它程序所解析。(因为有元数据来描述这些类型)
11.CIL只会包含元数据的引用,这些引用基于名称,而不是位置或偏移量等二进制信息。直到被CLR翻译为本机代码才会确定它的二进制信息。
12.任何语言只要具有能够发射(Emit)CIL代码和CLR元数据的编译器,就能被CLR 所解析。
13.当程序员面临生产率和可控性的选择时,随着时间的推移,在大多数应用场合,能够让他们拥有更高生产率的技术更有可能胜出。
三. 第二章 组件
1. CLR模块包含代码,元数据,资源。CLR模块依然是WinNT的PE/COFF的可执行文件的扩展版,它其中的大部分内容作为不透明的数据存放在PE/COFF文件的.text部分中。
2. 4种模块输出种类:exe, winexe, library, module。其中只有module不能独立部署(程序级才是部署的原子单位),即CLR无法直接加载它。
3. 程序集(assembly)是由一个或多个模块所组成的。
4. 程序集的元数据中包含程序集清单部分(assembly manifest,即.assembly,而不是.assembly extern),对于没有程序集清单的模块(module),CLR只能间接加载。
5. 程序集4部分名称(强名称):Name, Version, Culture, PublicKeyToken。
6. 含有Culture特性的程序集不能含有代码,它们是纯资源程序集(又称为satellite程序集)。也就是说包含代码的程序集都是culture-neutral的。
7. 强名称程序集会把Public Key附到程序集中。
8. CLR总是按需加载程序集。(Good Feature)
9. Assembly.LoadForm():直接通过程序集加载器加载(通过位置加载),完全忽略任何版本策略。
Assembly.Load():先通过程序集解析器解析,再通过程序集加载器加载。
10. 版本策略只能用在强名称程序集上边。
11. 版本策略的3个级别:应用程序策略(app.config)=>发行者策略(整合的资源)=>机器策略(machine.config)。其中要注意发行者策略一般用于组件,来标明组件那些版本可以互相兼容。(Good Feature)
12. 查找程序集文件的策略:[1] GAC => [2] CodeBase Hint (href指定位置) =>[3] Probing(AppBase目录和其子目录)
浙公网安备 33010602011771号