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