第三章:共享程序集和强命名程序集
两种程序集,两种部署
CLR支持两种程序集:强命名程序集和非强命名程序集(为了与前者对立,我们称为"弱命名程序集").这两种程序集在结构上完全一致,都是PE文件格式、PE32(+)头、CLR
头、元数据、清单表以及IL。区别:强命名程序集使用发布者的公钥/私钥对进行了签名,它唯一的标识了程序集的发布者。
一个程序集可以采取两种方式来部署:私有或全局。”私有部署的程序集“是指部署到应用程序基目录或者一个子目录中的程序集。弱命名程序集只能以私有方式部署。”全局部署的
程序集“是指部署到一些已知位置的程序集,CLR在查找这些程序集时,会检查这些位置。强命名程序集既可以私有部署,也可以全局部署。
一个公司要想唯一性的标识它的程序集,必须创建一个公钥/私钥对。然后,公钥可以同程序集关联。创建强命名程序集的方法
使用SN.exe获取一个密钥:SN -k MyCompany.snk 含义为告诉SN.exe创建一个名为MyCompany.snk的文件,文件中包含二进制形式的公钥和私钥。
一般而言,由于公钥是非常大的数字,而一个程序集可能引用其它大量程序集,所以在最终的生成文件中,相当一部分会被公钥信息占据,为了节省存储空间,microsoft对公钥
进行了哈希处理,并获取哈希值的最后八个字节。AssemblyRef表实际存储的是这种简化的公钥值(”成为公钥标记").我们看到的一般都是公钥标记,而不是完整公钥。
全局程序集缓存GAC
如果一个程序集要由多个应用程序访问,则必须把它放到一个已知的目录中,而CLR在检测到对该程序集的一个引用时,能够自动检测该目录,这个已知的位置称为全局程序集
缓存。注意:永远不要手动将程序集文件复制到GAC目录;相反,应该使用工具(gacutil.exe)来完成这项任务。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?