全局程序集缓存 (GAC)

计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享。

 

在全局程序集缓存中部署的应用程序必须具有强名称 GAC中的所有的Assembly都会存放在系统目录 "%winroot%/assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。

 

关于GAC本身,上面redcaff_l所引述的一段话正是MSDN中对GAC的定义。

GAC全称是Global Assembly Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。

举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:/WINDOWS/Microsoft.NET/Framework/v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。

除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:

1)创建一个strong-name的Assembly,例如ToolbarComponent.dll

2)运行gacutil -i ToolbarComponent.dll,把这个Assembly添加到GAC

3)在程序中动态装载: System.Reflection.Assembly ass=Assembly.Load( "ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f "); MessageBox.Show( "Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);

在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。

另外,Assembly.Load()中的参数可以通过 "gacutil -l "查到。 另外,上面提到了GAC中的Assembly必须是strong-name的。

创建strong-name的Assembly的步骤大致如下:

a) 在命令行运行“sn -k keyPair.snk”创建一个密钥文件。这里的sn.exe也是.NET附带的一个工具。

b) 在VS.NET里面修改“AssemblyInfo.cs”文件: [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile( "..//..//keyPair.snk ")]

c) 编译项目,就能得到一个strong-name的Assembly。

 

MSDN中有一些对GAC的介绍,您可以参考:

1)《Assembly Cache Viewer (Shfusion.dll)》

2)《Global Assembly Cache》 .NET Framework中附带了一些和GAC有关的工具,其中包括:

      1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly

      2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image 3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值