CLR 学习-- .net中的共享组件与GAC

共享组件


为了多个应用之间共享DLL。会需要创建共享组件。 签名的组件要注册在GAC中,并且引用它的DLL也要被签名。签名的组件名称由四个部分组成:public key, file name, version number , culture identity. 其中public key是被哈希过的(并取最后八位数),由称为public key token。


示例DLL
AssemblyRef #1 (23000001) 
------------------------------------------------------- 
Token: 0x23000001 
Public Key or Token: b7 7a 5c 56 19 34 e0 89 
...


签名的public key嵌入在manifest文件中。当包含manifest文件的PE文件被创建之后,PE文件的内容也会相应被哈希。
默认情况下,签名使用的是SHA-1算法。


编译过程中查找目录的顺序
DLL所在目录
包含CLR DLL的目录
使用/libcompiler switch 指定的目录
使用LIB 环境变量指定的目录




GAC
在安装.NET时,核心DLL被分别拷贝在了GAC子目录和编译器/CLR目录中分别一份。这样在运行时GAC中也能方便访问到.NET核心组件。
每当组件被注册在GAC时,GAC会为组件生成一个目录并将其拷贝进去(而不会override之前的版本)。menifest的文件内容会被哈希,与PE文件中所嵌入的RSA的数字签名进行比对。如果不相等则安装失败。
如果签名的组件不是从GAC加载的,每次加载都会导致对menifest文件进行哈希验证。
仅当组件是为了被多应用共享时,才建议安装在GAC。




.Net中的类型绑定过程


CLR 学习-- .net中的共享组件与GAC_第1张图片


你可能感兴趣的:(CLR 学习-- .net中的共享组件与GAC)