共享程序集和强命名程序集
两种程序集,两种部署
弱命名程序集&强命名程序集
强命名程序集使用发布者的公钥/私钥进行签名,使得程序集被唯一性的标识。
私有部署&全局部署
私有部署:部署到应用程序基目录或者某个子目录
全局部署:部署到一些公认位置。CLR在查找程序集时会检查这些位置。
强命名程序集可以私有部署也可以全局部署。弱命名程序集只能私有部署。
为程序集分配强名称
强命名程序集具有4个重要特性:文件名(不计扩展名)、版本号、语言文化、公钥
公钥数字很大,因此常使用公钥派生的小哈希值,称为公钥标记(public key token)。
例如:”MyTypes, Vesion=1.0.8123.0, Culture=neutrail, PublicKeyToken=b7a5c571934e089”
其他唯一性标识技术:
GUID(Global Unique Identifier,全局唯一标识符)
URL(Uniform Resource Locator,统一资源定位符)
URN(Uniform Resource Name,统一资源名称)
创建强命名程序集可以使用.Net Framework SDK和VS随带的Strong Name实用程序(SN.exe)获取密钥。
全局程序缓存
由多个应用程序访问的程序集必须放到公认目录,称为全局程序集缓存(Global Assembly Cache, GAC)。
可以使用GACUtil工具安装强命名程序集。
在生成的程序集中引用强命名程序集
强命名程序集能防篡改
用私钥对程序集进行签名,并将公钥和签名嵌入程序集,CLR就可验证程序集未被修改或破坏。
延迟签名
延迟签名允许只用公司的公钥生成程序集,暂时不用私钥。该技术称为延迟签名(delayed signing)或部分签名(partial signing)。但是这么做会失去保护,只有开发阶段使用。
私有部署强命名程序集
在GAC中安装程序集的优势:
- 能被多个应用程序共享,减少总体物理内存消耗
- 容易更新新版本
- 可以实现对程序集多个版本的并行管理
强命名程序集除了部署到GAC或者进行私有部署,还可以部署到只有少数应用程序知道的目录。但由于u搜友应用程序不能独立决定何时可以拆卸程序集文件,不推荐使用。
“运行时”如何解析类型引用
解析引用的类型时,CLR可能在三个地方找到类型:
- 相同文件
编译时便能发现对相同文件中的类型的访问,称为“早期绑定”(early binding)。类型直接从文件中加载。(对应的,在运行时通过反射机制绑定类型并调用的方法称为晚期绑定late binding) - 不同文件,相同程序集
“运行时”确保被引用的文件在当前程序集元数据的FileDef表中,检查加载程序集清单文件的目录,加载被引用的文件,检查哈希值确保文件完整性。发现类型成员,执行继续。 - 不同文件,不同程序集
如果引用的类型在其他程序集文件中,会加载被引用程序集的清单文件。如果需要的类型不在该文件中,就继续加载包含的类型文件。发现类型的成员,执行继续。
高级管理控制(配置)
略