C#程序集系列11,全局程序集缓存
全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集。当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集。
为什么需要全局程序集缓存?
假设程序A引用B程序集,程序C也引用B程序集,在这种情况下,可以把B程序集放到一个全局程序集缓存中是明智的做法。
□ 使用全局缓存程序集
→删除F盘as文件夹中所有dll和exe后缀的文件
→编译Cow.cs成程序集
→把刚创建的Farm.dll存放到全局程序集缓存中
报错是因为,非强名称程序集是无法保存到全局程序集缓存中的。
→重新编译Cow.cs,这次使用密匙
→再次把Farm.dll存放到全局程序集缓存中
如果想把一个强名称程序集从全局缓存中取出:gacutil -u farm
→编译MainClass.cs成可执行文件,引用Farm.dll
→用记事本打开MainClass.cs,修改如下,保存
using System;
class MainClass
{static void Main(){Cow.Moo();Cow.Moo();Cow.Moo();}}
→再次编译MainClass.cs,引用现在已经在全局程序集缓存中的Farm.dll
→把Farm.dll从as文件夹中删除,因为已经存放到全局程序集缓存中了
→再次运行MainClass.exe和AnotherMainClass.exe
说明已经在使用全局程序集缓存中的Farm.dll了。
□ 全局缓存程序集在哪里
在"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Farm\v4.0_3.3.3.3__863de8402b3a9978"文件夹中
总结:
○ 当程序集可能被多次引用,可以考虑把程序集放入全局程序集缓存
○ 自定义程序集和.NET默认的一些程序集,都被放在"C:\Windows\Microsoft.NET\assembly\GAC_MSIL"了这个全局程序集缓存文件夹中
○ C#编译器会先优先到全局程序集缓存中找寻程序集
“C#程序集系列”包括:
C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
C#程序集系列02,使用记事本查看可执行程序集的IL代码
C#程序集系列03,引用多个module
C#程序集系列04,在程序集包含多个module的场景下理解关键字internal
C#程序集系列05,让程序集包含多个module
C#程序集系列06,程序集清单,EXE和DLL的区别
C#程序集系列07,篡改程序集
C#程序集系列08,设置程序集版本
C#程序集系列09,程序集签名
C#程序集系列10,强名称程序集
C#程序集系列11,全局程序集缓存
C#程序集系列12,C#编译器和CLR如何找寻程序集
C#程序集系列13,如何让CLR选择不同版本的程序集
参考资料:
http://www.computersciencevideos.org/ created by Jamie King