《Essential .Net》读书笔记 - Chapter 2

笔记

Chapter 2

1.         CLR程序存在于模块中(module)中。一个CLR模块是一个字节流,储存在一个文件(本地或远程服务器)。

2.         CLR模块采用WinNT的PE(Portable Executable)/COFF(Common Object File Format)格式的扩展版。CLR模块也是有效的Win32模块,可以通过LoadLibrary系统调用加载。CLR模块用到的PE/COFF的功能极少,大部分内容是使用PE/COFF文件的.text部分。

3.         CLR模块包括代码、元数据和资源。代码使用CIL(Common Intermediate Language)格式存放(个人理解:这个和MSIL或者IL是一个东西)。模块的元数据描述了模块中定义的类型,包含名字、继承关系、方法签名和依赖关系等。模块的资源由静态的只读数据组成(字符串、位图等)。

4.         (/t:exe、/t:winexe、/t:library、/t:module)module产生的是“未加工”的模块(.netmodule)。/t:library编译产生的模块(.dll)包含元数据。/t:exe生成控制台程序、/t:winexe产生Win程序。

5.         起点为四种形式之一:static void Main(){}、static void Main(string[] argv){}、static void Main(){return 0}、static void Main(string[] argv){return 0}。是否有public无所谓,一个程序不可有多个入口,多个Main函数需要在编译时使用/main开关。

6.         程序集(assembly)为一个或多个模块的逻辑集合。程序集通过独立于位置的名字进行引用。这个名字必须翻译为文件系统中或Internet上的物理路径,最终指向一个或多个包含类型定义、代码以及资源的模块。

7.         “多模块”的作用就是把“常用”和“不常用”的代码加载区分开来(可以在运行时做到“要什么下载什么”),可以作到使用一种语言写底层,一种语言写界面。

8.         一个模块往往只属于一个程序集,如果需要违反,那么会将这个公用模块产生两个不用的拷贝。

9.         模块依赖于来自其他程序集的类型(至少有mscorlib.dll里的),每个模块都有一个程序集名字列表,然后CLR负责在运行时将这些程序集的名字转换成模块的路径名。

10.      每个程序集有一个程序集清单(assembly manifest),这是元数据的一部分,相当于附加类型定义和代码的附属文件目录。

11.      含有程序集清单的模块首先被CLR加载,然后根据这个清单的内容加载其余不含清单的模块。

12.      引用别的模块使用/addmodule开关,引用别的程序集使用/r开关。

13.      含有程序集清单的模块将包含外部引用程序集的主要列表。列表由程序集中每个模块的依赖关系组成,这样通过加载一个文件就能找到程序集所有的依赖关系。

14.      internal导致只对同一程序集的模块可用;public导致所有的代码都可用;private只有该类型的方法才可用;protected使派生类的方法等也能访问该成员;protected和internal可以一起用。

15.      命名空间(namespace)+类名。

16.      每个程序集采用四部分(four-part)名字,作为唯一的标识。这四部分为名称、文化、开发人员、组件版本。这些名字被放在程序集清单里,在加载时,CLR使用四部程序集名字找到正确的组件。

17.      每个程序集的名字都有一个版本号:Major.Minor.Build.Revision,如果没有显式设定这个版本号,那么就是0.0.0.0。System.Reflection.AssemblyVersion能接受各种字符串格式(1.2.d.s等)。

18.      CultureInfo特性标识着组件开发所用到的语言和国家代码(语言环境)。含有CultureInfo特性的程序集不能包括代码,必须是“纯资源”的程序集(resource-only)。含代码的程序集是文化无关的(culture-neutral)。

19.      程序集名字包含一个“公钥”(public key),标识组件的开发人员。可以选择使用8位的或者128位的公钥标记,这样就可以标记着相同文件名的不同程序集。

20.      有时候必须手动引用程序集。CLR定义了一个标准格式,用于将程序集的四部分名字编写字符串。这个格式被称为程序集的显示名字(display name):Name, Virsion=X.X.X.X, Culture=[xx-XX | Neutral], PublicKeyToken=[XXXXXXXXXXXXX | Null]。Culture为Neutral表示程序集没有文化限制,PublicKeyToken为null表示不带公钥。简单省略一个部分的限定名字表示允许匹配任何Culture或PublicKeyToken。

21.      一般来说,应该避免使用程序集的部分限定名,否则CLR可能会以非预期的方式运行。可以在配置文件里写全名,然后使用部分名在程序中调用(Assembly assm = Assembly.Load(“XXXX”))。PartialName(上面的XXXX)必须存在于配置文件的PartialName中

22.      CLR会尽量少加载不需要的模块,当确实使用了才会加载。这样减少了初始化时间,也减少了运行程序所消耗的资源。CLR加载是由基于类型的JIT编译器触发的,JIT将方法体的CIL编译成机器码时,要访问的局部变量,参数等数据类型会被一起加载。

23.      如果不要CLR屡次的加载模块可以有两种做法:一是定义一些静态字段。二是用手动显式加载。

24.      如果要显式的和程序集交互,需要使用System.Reflection.Assembly的LoadFrom方法,它可以是本地的一个文件,也可以是“file://...”,如果是从非“file://...”的URL中调用,则需要Web Permission,这个模块被加载时会被首先下载到缓存里。

25.      尽管通过位置加载程序集很有意思,但是大多数程序集是通过程序集解析器(assembly resolver)按名字加载的。方法是System.Reflection.Assembly的Load方法,涉及到所在目录,版本控制和一些其他配置细节的问题。

26.      程序集解析器首先采用的是有效的版本策略(version policy),然后可能会加载所需程序集的替代版本(不同版本的程序集为不同程序集,但是程序集映射的时候必须同名)。版本策略只能应用于四部分名完全限定的程序集,如果程序集名字是部分限定的(比如缺少公钥标记,版本或文化)那么就不能用版本策略了(直接使用LoadFrom方法由于指定的是文件,所以就没有什么版本策略的问题了)。

27.      版本策略可以通过配置文件决定,计算机范围(machine-wide)的配置文件为machine.config,存在于%SystemRoot%\Microsoft.net\Framework\V1.0.nnnn\CONFIG目录下。对于应用程序范围(application-wide)的配置文件,普通应用程序是应用程序目录下,文件名为EXE文件名后加config扩展名。ASP.NET为web.config。

28.      配置文件为XML语言文件,总有一个configuration的根元素。这些配置文件的设置控制了探测路径以及发行者版本策略模式。此外,dependentAssembly元素被用于对每个依赖的程序集制定版本和定位设置。(配置文件在中文版P36页有范例)。

29.      版本策略在三个级别上指定:应用程序(per application)à 组件(per component)à 机器(per machine)。前者输出为后者的输入。

30.      除了特定应用程序和计算机范围的配置文件外,给定的程序集还有发行者策略(publisher policy)。它由开发人员声明,标明哪些版本是互相兼容的。

31.      中文版P39页——展示了程序集解析器寻找适合的程序集文件的整个过程。

32.      为了避免二义性,程序集解析器只有在被请求的程序集名字中包含公钥时才查找GAC。公钥既能够作为程序集引用或者Assembly.Load参数的一部分显式地被提供,也可以通过qualityAssembly配置文件隐式地被提供。

33.      GAC由系统级的组件(FUSION.DLL)控制,将DLL缓存存储在%WINNT%\Assembly目录下。

34.      CODEBASE提示配置文件实例:中文版P41页

35.      如果程序集解析器通过GAC或CODEBASE提示都无法定位程序集,那么程序集解析器将对于应用程序根目录相关的目录进行查找。这个查找被称为探测(probing)。(中文书P43 - P45页)

36.      程序集被版本化为一个单元。如果替换程序集中文件的一个子集,而不更新版本号,将导致不可预测的结果。如果类型的功用约定改变了,类型的程序集必须赋予一个新的版本号。

37.      CODEBASE提示,私有探测路径以及GAC就可以支持多个版本的并行安装,这允许给定的程序集的多个版本在文件系统中和平共处。然而,如果有多个这样的程序集被独立程序或者单个程序实际加载到内存中,那么,事情在某种程度上就是不可预测的。并行执行要比并行安装要难处理得多。

38.      共享类型需要被部署到单独的程序集中,它本身不会被版本化。(和《Applied》中描述接口应用程序的说法比较类似)。

39.      用于程序集的原数据具有三个特别的特性,他们允许开发人员制定程序集的版本是否同时能被加载。这些元数据为都被现行的程序集解析器和加载器所忽略。然而,他们确实能够起到提示作用,这个提示有望在CLR的未来版本中实施。

时间: 2025-01-21 13:19:41

《Essential .Net》读书笔记 - Chapter 2的相关文章

《Essential .Net》读书笔记 - Chapter 3

笔记 Chapter 3 1.         工作人员划分了程序集以后,他们大部分时间就用来考虑类型如何工作,如何联系了.所有的表示类型的构建(类,结构,枚举等)最终会映射到CLR的类型定义上. 2.         CLR类型(CLR type)是命名的可重用抽象体.CLR类型的描述存放在CLR模块的元数据中,该模块还包含是类型工作所需要的CIL或者本机代码. 3.         完全限定的CLR类此哪个名包括三个部分:程序集名字.可选的命名空间前缀和类型名称. 4.         公共

《Essential .Net》读书笔记 - Chapter 1

笔记 Chapter 1: 1.         组件技术主要强调的是独立开发和部署程序之间的协定(contract,就是说好怎么做就要怎么做).COM是M$首次尝试将这些约定规范化.COM出现之前,约定仅仅表现为简单的函数入口,于是COM从以前的世界跨出了一大步,是个重大的进步,它将动态加载代码和类型系统以相当一致的方式有机地结合在一起. 2.         COM是编程模型,也是支持的平台技术,但是它缺乏一个稳固的平台技术,因此,COM技术面临终结. 3.         对于约定描述,M

『 读书笔记 』4月读书总结|博文推荐

原文链接:『 读书笔记 』4月读书总结|博文推荐 写在前面 计划是每月读 5-10 本书,书籍类型大概是三个方面的:金融,技术,管理.之所以选择这三个方面,一方面是因为自己对这三个方面都很有兴趣,其次是被 linkedin 创始人 Hoffman 的 ABZ 理论 深度影响.建议大家都看看 abz 理论那篇文章,如果我有空,也会整理一些常用的这类理论模型到博客里的. 月底读书总结的形式都很简单,只是简单的一个列表和简单的书评,对觉得比较好的书会有单独的读书笔记.另外推荐大家用 excel 来做一

091025 L DNA读书笔记

读书笔记和读后感 02 如何开始第一个工作     大企业,有很多好处.它与小企业的不同在于,小企业的竞争是对外的,而大企业的竞争则是来自于内部的.选择进入大企业的人,一定要有一个目标,多年后做到某个位置的目标.大企业适合喜欢跟同事竞争的人工作.     小企业,坏处是没有大企业的待遇好,不过可以学会更多的本领.     政府机关,如果选择到这里工作,那就是一个比较稳定的工作.在这里,如果比别人更勤奋的话,爬得也比别人快.     自由职业,如果选择这种方式工作,那么需要人有比较高的自我管控能力

Java与XSLT读书笔记(1)

笔记 <Java与XSLT>读书笔记 一,所有的XSLT处理器必须包括四个内置的模版规则,它们的优先级要低于任何其他规则,所以只要编写一个新的模版规则来匹配相同的式样,就可以覆盖它们.理解内置规则的最好方法就是架设它们总是位于后台,如果没有找到其他匹配一个节点的规则,就应用这些内置规则. <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> <xsl:te

《点石成金》读书笔记:为网站增加注意力吸引点

文章描述可用性设计建议--<点石成金>读书笔记. 阅读笔记8-12章 1. WEB设计团队讨论可用性是在浪费时间 原因 1"每个人都喜欢______" 我们也是Web用户对网站上自己喜欢什么不喜欢什么有着强烈的感觉.而且由于主张的力量和人的天性自然有种把这些喜欢或不喜欢投射到整个Web用户身上的倾向. 2职位情绪 设计师通常认为大多数人喜欢视觉上看起来有趣的网站开发人员认为人们喜欢功能又多又酷的网站在建立优先级时他们在看法上的不同常引发冲突. 更大的冲突是市场文化和工程文化

深入了解JVM-----Inside JVM读书笔记

笔记   本文首先介绍一下Java虚拟机的生存周期,然后大致介绍JVM的体系结构,最后对体系结构中的各个部分进行详细介绍. (  首先这里澄清两个概念:JVM实例和JVM执行引擎实例,JVM实例对应了一个独立运行的java程序,而JVM执行引擎实例则对应了属于用户运行程序的线程:也就是JVM实例是进程级别,而执行引擎是线程级别的.) 一. JVM的生命周期 JVM实例的诞生:当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String

PHP-SOCKETS读书笔记

笔记 学习PHP2个月了,收获挺多.但是与别人不同的是,我更喜欢SOCKET.PHP在SOCKET这方面的文章太少了.所以决定写一系列PHP-SOCKET读书笔记.一直从最基本写到SOCKET_RAW.实例+心得.实例将会有端口转发(突破防火墙),动网类型EXP,端口扫描,PHP后门,发包型EXP框架.由于学习缘故,每周只能写一篇.现给出卷一.希望大家一起投入到PHP SHELL编程中来. 前言: PHP是世界上最流行的脚本语言之一.一直以来它在WEB编程中得到极广泛的应用.我想说的是PHP不仅

一个男人和三个女人的故事[《.net框架程序设计》读书笔记

.net框架|笔记|程序|设计|示例 第十一章 多事件示例[一个男人和三个女人的故事] 摘要: 应用FCL中的System.ComponentModel.EventHandlerList示例一个类型中发布多事件的应用 场景:一个男生有三个女朋友,各自有不同的爱好,女朋友A爱好音乐,女朋友B爱好美食,女朋友C爱好XXX,为满足各个女朋友,此男生必须进行唱歌.烹饪食物.xxx. 以此制作程序演示单类型多事件的应用,并假设此男同时只能干一件事情(即排除一边xxx一边唱歌或一边xxx一边烹饪的可能J)