GAC-Global Assembly Cache

来源:互联网 发布:乐乎lofter南山兵哥 编辑:程序博客网 时间:2024/05/17 07:49

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附带的一个工具。 (注意:在执行这个命令的时候,命令行的提示符应该指向你工程所在的目录位置,对于C#工程来数,也就是*.csproj所在的目录)

  b) 在VS.NET里面修改“AssemblyInfo.cs”文件:

  [assembly: AssemblyDelaySign(false)]

  [assembly: AssemblyKeyFile("..//..//keyPair.snk")] (注意:由于VS2008不提倡在AssemblyInfo.cs文件中,设置AssemblyKeyFile属性。所以,当你设置好之后编译工程的时候,会出现警告错误,错误内容是{使用命令行选项“/keyfile”或适当的项目设置代替“AssemblyKeyFile”},所以建议在工程的属性中设置。具体操作方法:工程右键属性->署名->Assembly署名->设置*.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的主要功能。

原创粉丝点击