原文标题:

原文地址:https://www.cnblogs.com/1996V/p/9037603.html

共享程序集GAC

我上面说了这么多有关CLR加载程序集的细节和规则,事实上,类似于mscorlib.dll、System.dll这样的FCL类库被引用的如此频繁,它已经是我们.NET编程中必不可少的一部分,几尽每个项目都会引用,为了不再每次使用的时候都复制一份,所以计算机上有一个位置专门存储这些我们都会用到的程序集,叫做全局程序集缓存(Global Assembly Cache,GAC),这个位置一般位于C:\Windows\Microsoft.NET\assembly和3.5之前版本的C:\Windows\assembly。
既然是共享存放的位置,那不可避免的会遇到文件名重复的情况,那么为了杜绝该类情况,规定在GAC中只能存在强名称程序集,每当CLR要加载强名称程序集时,会先通过标识去GAC中查找,而考虑到程序集文件名称一致但版本文化等复杂的情况,所以GAC有自己的一套目录结构。我们如果想将自己的程序集放入GAC中,那么就必须先签名,然后通过如gacutil.exe工具(其存在于命令行工具中 https://docs.microsoft.com/zh-cn/dotnet/framework/tools/developer-command-prompt-for-vs中)来注册至GAC中,值得一提的是在将强名称程序集安装在GAC中,会效验签名。

GAC工具: https://docs.microsoft.com/en-us/dotnet/framework/tools/gacutil-exe-gac-tool

延伸

CLR是按需加载程序集的,没有执行代码也就没有调用相应的指令,没有相应的指令,CLR也不会对其进行相应的操作。 当我们执行Environment.CurrentDirectory这段代码的时候,CLR首先要获取Environment类型信息,通过自身元数据得知其存在mscorlib.dll程序集中,所以CLR要加载该程序集,而mscorlib.dll又由于其地位特殊,早在CLR初始化的时候就已经被类型加载器自动加载至内存中,所以这行代码可以直接在内存中读取到类型的方法信息。
在这个章节,我虽然描述了CLR搜索程序集的规则,但事实上,加载程序集读取类型信息远远没有这么简单,这涉及到了属于.NET Framework独有的"应用程序域"概念和内存信息的查找。

简单延伸两个问题,mscorlib.dll被加载在哪里?内存堆中又是什么样的一个情况?

最新文章

  1. Spring对事务管理的支持的发展历程--转
  2. 基于Eclipse的Hadoop应用开发环境配置
  3. Java自己实现双向链表LinkList
  4. 通过颜色代码初始化UIColor
  5. html5学习小结,float练习。
  6. 【GPU编解码】GPU硬解码---DXVA
  7. MySQL学习基础 之 起航篇
  8. 【转载】拒绝平庸——浅谈WEB登录页面设计
  9. MVC中的@Html.DisplayFor如何控制日期的显示格式
  10. web.config connectionStrings 数据库连接字符串的解释
  11. Code Understanding Step by Step - We Need a Task
  12. WdatePicker.js 日期时间插件
  13. 百度文本编辑器 Ueditor for net 使用七牛存储附件的实现
  14. socket编程2
  15. Android setTextColor无效_安卓setTextColor()的参数设置方式
  16. Mybatis学习之JDBC缺陷
  17. .net简单的静态页生成
  18. 小程序脚本语言WXS,你想要的都在这里了
  19. AngularJS进阶(四)ANGULAR.JS实现下拉菜单单选
  20. Mysql 查看连接数,状态 最大并发数(赞)

热门文章

  1. HTML+css 文字只显示一行
  2. 前端String转json
  3. git 完善使用中
  4. OAuth2.0 与 oauth2-server 库的使用
  5. P2257 YY的GCD
  6. 深浅拷贝--python(预习中随手写的。因为当时很无聊。。。)
  7. TensorFlow之tf.nn.dropout():防止模型训练过程中的过拟合问题
  8. OI生涯回忆录(二)
  9. 长沙Uber优步司机奖励政策(1月11日~1月17日)
  10. 【selenium】selenium全分享