共享程序集GAC

Posted 1996v

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共享程序集GAC相关的知识,希望对你有一定的参考价值。

 

原文标题:

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

共享程序集GAC

我上面说了这么多有关CLR加载程序集的细节和规则,事实上,类似于mscorlib.dll、System.dll这样的FCL类库被引用的如此频繁,它已经是我们.NET编程中必不可少的一部分,几尽每个项目都会引用,为了不再每次使用的时候都复制一份,所以计算机上有一个位置专门存储这些我们都会用到的程序集,叫做全局程序集缓存(Global Assembly Cache,GAC),这个位置一般位于C:WindowsMicrosoft.NETassembly和3.5之前版本的C:Windowsassembly。
既然是共享存放的位置,那不可避免的会遇到文件名重复的情况,那么为了杜绝该类情况,规定在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被加载在哪里?内存堆中又是什么样的一个情况?

 



以上是关于共享程序集GAC的主要内容,如果未能解决你的问题,请参考以下文章

何时以及何时不安装到 GAC 中?

.Net Gacutil工具(全局程序集缓存工具)使用教程

(28)部署强命名程序集到GAC

共享程序集和强命名程序集:“运行时”如何解析类型引用

如何从 GAC 中提取程序集?

确定是不是正在使用 GAC 和 NGen 的程序集