【20091222-01】【转】GAC

http://alinw.blog.hexun.com/34972093_d.html

GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。  
    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的作用就是提供给CLR一个已知的确定的目录去寻找引用的程序集。 
  除了系统默认放置在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"查到。  
   
必须使用强名称。要生成此加密密钥对,请使用 SN 工具。此工具位于安装 .NET Framework 解决方案开发人员工具包 (SDK) 的 Bin子目录中。SN 工具易于使用。命令行语句采用以下形式:
sn -k "[驱动器号]:[放置密钥的目录][密钥名称].snk"
在 C: 中创建一个名为 GACKey 的目录,以便您可以轻松地找到密钥,并从命令提示符处访问该密钥。
注意:对于大多数用户,.NET 工具位于
[安装VS的目录]\SDK\v2.0\Bin中。键入以下 SN 命令前,可能需要在您的计算机上将与该路径类似的路径复制到 .NET bin 目录中。从命令提示符处键入 cd,右键单击以粘贴该路径,然后按 ENTER 键,快速转至 SN 工具所在的目录。
键入以下内容:
sn -k "C:GACKeyGACkey.snk"
将生成一个密钥,但是它与项目的程序集尚无关联。要建立此关联,请在 Visual Studio .NET 解决方案资源管理器中双击 AssemblyInfo.cs 文件。此文件具有一个程序集属性列表,默认情况下,在 Visual Studio .NET 中创建项目时将包括这些属性。在
AssemblyInfo.cs代码中修改“AssemblyKeyFile”程序集属性,如下所示:
[assembly:AssemblyKeyFile("C:\GACKey\GACKey.snk")]

在部署CarLibrary.dllGAC前,需要指出的是:其实Visual Studio 2005允许我们使用项目的属性页指定*.snk文件的位置(这是目前更提倡的一种做法,在Visual Studio 2005使用[AssemblyKeyFile]特性的话,编译时会产生警告)。选择Signing节点,提供*.snk的路径,选中“Sign the assembly”复选框(如图11-19所示)。

11-19  使用项目属性页指定*.snk文件

通过按 CTRL+SHIFT+B 来编译项目。您不必具有任何附加代码即可以在 GAC 中安装 .dll 文件。
您可以通过使用 Gacutil 工具或者通过将 .dll 文件拖至适当的目录来安装 .dll 文件。如果您使用 Gacutil 工具,则可以方法一:

使用以下命令:
gacutil -I "[驱动器号]:[VS 项目中 Bin 目录的路径]gac.dll"

查看更多精彩图片

查看更多精彩图片


方法二:

如果您要拖动文件,请使用 Microsoft Windows 资源管理器。打开 Windows 资源管理器的两个实例。在一个实例中,找到控制台项目的 .dll 文件输出的位置。在另一实例中,找到 c:[SystemRoot]Assembly。
将您的 .dll 文件拖到“Assembly”文件夹中。

 


.NET   Framework中附带了一些和GAC有关的工具,其中包括:  
  1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly  
  2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native   Image  
  3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能

 

 

http://www.6suv.com/20070529/13487/

dll添加到GAC,在C:\WINDOWS\assembly下可以看到,但在添加引用里看不到

方案一:在“添加引用”对话框中显示程序集
即使已将程序集安装到全局程序集缓存 (GAC) 中,“添加引用”对话框也不会自动显示每个程序集。“添加引用”对话框基于路径并要求添加注册表项,该项指定要显示的程序集的位置。

在“添加引用”对话框中显示程序集
添加以下注册表项之一,其中 <AssemblyLocation> 是要在“添加引用”对话框中显示的程序集目录,例如 C:\\MyAssemblies。

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework\<version>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\<version>\AssemblyFoldersEx\MyAssemblies]@="<AssemblyLocation>"

注意
在 HKEY_LOCAL_MACHINE 配置单元下创建注册表项以后,所有用户都可以在“添加引用”对话框的指定位置看到程序集。在 HKEY_CURRENT_USER 配置单元下创建注册表项只会影响当前用户的设置。
 

重新启动 Visual Studio。
 

方案二:
可以把你的DLL复制到.NET   Framework目录(%WINDIR%\Microsoft.NET\Framework\v1.x.yyyy)中,这样的话.可以达到你的目的.   但是,MS建议我们不应该将自己的assembly拷贝到Framework目录中。一个更好的方法就是把它们放在一个单独的目录中,然后给Windows   Registry添加一个key,告诉VS.NET在哪里可以找到这些assembly。除了核心的Framework   assembly外,VS.NET也可以显示在以下这些Registry   key中列出的目录中的任何assembly:HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\AssemblyFolders  
HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AssemblyFolders  
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\7.1\AssemblyFolders  
HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\7.1\AssemblyFolders  

posted @ 2009-12-22 16:38  WillWayer  阅读(329)  评论(0编辑  收藏  举报