CLR via second edtion读后感

 一、assembly的结构

表头

PE头,Windows早就使用的PE格式

COFF头

text

IMAGE_COR20_HEADER ?是CLR头吗

Code        IL代码或本地代码

资源数据    静态只读数据

字符串/BLOB池 ?字符串池是在module中?二进制大对象,只是二进制吗

metaData module名,引用的assembly,定义的类型信息

 

Assembly manifest 放在一个明确的module中,包含assembly name,下级模块,下级模块的公共类型列表。(即一个程序集是由哪些文件构成的,文件的外部可见内容)?资源文件是在module中吗?与essential .net has defected

CLR第一次引用一个assembly外类型时,在引用类型的metadata里知道引用的assembly是哪个?此时能确定引用的是哪一个assembly么,是在之前已经生成了一些信息,故知道引用的是哪个assembly,还是该书说的CLR会根据using试着加载,找到并加载该assembly中包含着menifest 的module,现在该module中查找,若找不到,再根据公共类型列表查找,定位到IL后,jit翻译成本机代码并存储在内存中。以后再引用该方法、成员,会直接到对应的内存中找(物理关联了)。?CLR分配一个内部数据管理main所引用到的类型的访问,其中每个成员都有一个对应的地址

二、程序集的部署和加载

Assembly是实施可重用、版本和安全策略的原子。

私有部署程序集:和应用程序部署在同一个Bin下。

全局部署:只能是强命名程序集,一般是在GAC目录下。通过configuration配置(关于强命名程序集,就是有一个发布者的公钥和私钥)还可以在Appconfig中指定CLR可去哪个目录查找。

CLR定位程序集,现在根目录和子目录下查找,尝试.dll和.exe。再去GAC下查找,若有指定目录,则还会去指定目录查找。

Assembly标识:名、version、culture、key

Delay signing,开发测试阶段不使用私钥,打包部署时才用。

发布者策略程序集:配置文件+程序集,当update了一个程序集,却还需要引用到原来的版本。适合修复版、补丁版

When Application run,CLR会维持所加载的assembly的记录。当新的assembly导致Application run错误,可用configure file 告诉CLR使用上次正常运行的assembly。

三、类型相关

                                         Equals      GetHashCode

所有类型的基类object     ToString     Finalize             Vitual

                                     GetType          

                                     MemberwiseClone                非Vitual

New class,new作用:1.申请分配托管堆内存2.初始化3.添加方法表和sync

Boxing,1.申请托管堆内存2.添加对象sync和方法表,copy值进去3.返回引用地址

Unboxing,1.返回已装箱中值类型字段的地址

一般在unboxing之后,会做copy值的操作。

Boxing,一般是用于方法需要一个指向值类型的引用。

类想要实例实现克隆就必须实现ICloneable接口。

使用常数const是为了可读性、可维护性

值类型可显式实现constructor,并显式调用。Constructor必须是有参数的。

Value type的new只是初始化值。

字段的值都是在构造器(实例和类型构造器)中初始化的

基元类型的转换编译器知道,而非基元类型的转换就要写转换构造器。如,constructor(...),ToString()

Ref & out的差别仅仅是要求传参前初始化

Params是对Array作参数的代码的美化。只能用作方法参数的最后一个

有参属性 indexer public T this[int or string...]{get{} set{}}

重写Equals

四、未完成版

Module是一个字节流的PE文件(代码——IL或本机代码,元数据——module名,referenced assembly,definition class Info, 资
源——静态只读数据、字符串池、BLOB池等)
assembly manifest放在一个明确的module中,包含assembly version,下级module,下级module的public type list。还有个resourceRef?
posted @ 2012-08-31 22:12  zzq417  阅读(195)  评论(0编辑  收藏  举报