程序集(dll) 安装到 GAC 中的方法 && 程序集添加到 add refetence中的方法

一 首先 程序集(dll) 安装到 GAC 中的方法

所谓的GAC,就是全局程序集缓存(Global Assembly Cache)。

针对一些类库项目或用户控件项目在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可以调用。被放入GAC的程序集,无论在何处被其他程序集引用,都可以保证自己能够被CLR找到并且加载。简单来说,GAC是一个有规范的目录结构。如果主机使用的是Windows操作系统,并且操作系统被安装在c:\windows下,那么GAC会被安装在c:\windows\assembly\下。

在一般情况下,GAC具有如下优点:
· 程序集被多处引用时,可有效减少内存成本。
· 通过发布者策略可以有效地发布程序集的最新版本。
· 同一程序集的多个版本可以共存,并且可以通过配置进行切换。
是否所有的程序集都可以被放入GAC中呢,答案是否定的。

开始安装

第一步: 给项目添加强名称:

  1. 在类库项目调试完成后,使用sn.exe工具生成一个密钥,此工具位于安装 .NET Framework 解决方案开发人员工具包 (SDK) 的 \bin 子目录中。SN 工具易于使用。

  命令行语句采用以下形式:

   sn -k "[DriveLetter]:\[DirectoryToPlaceKey]\[KeyName].snk"
   即: sn -k "生成的密钥的全路径"。 如在命令行输入: sn -k D:/myKey.snk

  2. 方法一:将密钥与项目的程序集进行关联: 项目属性-->签名-->为程序集签名-->选择强名称密钥文件。
  方法二 在项目的AssemblyInfo.cs文件中,修改"AssemblyKeyFile"的属性。 例如: [assembly:AssemblyKeyFile("D://myKey.snk")]

  3. 重新生成项目集。

第二步: 将dll添加到GAC中

一般来说,将程序集(dll)安装到GAC中有以下几种方法:

1. 管理工具->Microsoft.NET Framework 2.0 配置->管理->我的电脑->程序集缓存->选中右键"添加"->将程序集添加到程序集缓存。

2. 手动将要安装部署的dll文件拖至系统目录windows下的assembly文件夹下(一般为C:/windows/assembly),此种方法不便于在安装部署时使用。

3. 使用gacutil.exe工具安装:gacutil -i "要注册的dll文件全路径"。

"gacutil.exe”工具为.NET自带工具(C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin)

  在开始运行中输入"cmd”进入命令窗口,通过CD选择到"gacutil.exe”文件所在的目录,如在命令行输入: gacutil -i D:/Microsoft.SharePoint.dll

好了现在已经成功将DLL 安装到了GAC中但是这里有两点注意:

  1. 将程序集安装到GAC后,在VS的添加引用的对话框中并不会出现该程序集。 例如我将my.dll这个程序集使用Gacutil -i my.dll注册到GAC后,在添加引用的对话框中我们并不能找到它,这是因为添加引用对话框中的程序集都是位于"C:/Program Files/Reference Assemblies/" 或 "C:/Windows/Microsoft.NET/Framework/版本号/"下,可以通过注册表增加类似的文件夹使得可以被添加引用对话框搜索到其下的程序集 下面即将介绍到
  2. 需要大家明白一点,将程序集安装到GAC中主要是为了方便共享以及解决Dll hell的问题,并不适合在程序开发的过程中使用。那怎么样才能使用GAC中的程序集呢?这个不用你担心,Runtime会在GAC或指定目录中自动搜索所要引用的程序集。

二 程序集添加到 add refetence中的方法

在Visual Studio中,当为一个工程添加程序集引用时,弹出的“Add Reference”对话框会列出来一些程序集引用,如下图所示。那么如何把自己的程序集也添加到这里呢?




    		    程序集(dll) 安装到 GAC 中的方法 && 程序集添加到 add refetence中的方法
add reference是通过注册的路径进行扫描读取的。
因此通过修改注册表的方法可以做到这点。
对于32位的操作系统,添加如下注册表键的一个:
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework\VersionMinimum\AssemblyFoldersEx\MyAssemblies]@="AssemblyLocation"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\VersionMinimum\AssemblyFoldersEx\MyAssemblies]@="AssemblyLocation"
对于64位的操作系统,在32位注册表分支中添加如下注册表键的一个:
[HKEY_CURRENT_USER\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\VersionMinimum\AssemblyFoldersEx\MyAssemblies]@="AssemblyLocation"
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\VersionMinimum\AssemblyFoldersEx\MyAssemblies]@="AssemblyLocation"
VersionMinimum表示应用的最低.NET Framework版本。如果VersionMinimum是v3.0,在AssemblyFoldersEx中指定的文件只适用于目标.NET Framework是3.0和更新的。
AssemblyLocation表示你想要在“Add Reference”对话框中显示的程序集所在位置。在HKEY_CURRENT_USER节点下创建只影响当前用户的设置。关闭并重启VS之后,在填加程序集时就能够看到新加的引用。
1.创建并build一个DLL名字为TestAddReference.dll,把它拷贝到c:\test目录下,如下图所示:



    		    程序集(dll) 安装到 GAC 中的方法 && 程序集添加到 add refetence中的方法
2.创建注册表键和键值[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\testDll]@="c:\test\",如下图所示:



    		    程序集(dll) 安装到 GAC 中的方法 && 程序集添加到 add refetence中的方法
3.重新打开VS,添加引用,在弹出的“Add Reference”对话框中,如果工程的目标.NET Framework是在v2.0.50727版本以上,你会看到TestAddReference,如下图所示:



    		    程序集(dll) 安装到 GAC 中的方法 && 程序集添加到 add refetence中的方法


需要注意点:

1 32位机器与64位机器的注册表键值插入位于不同位置。

2 不同类型的程序注册表位置不同 silverlight 以及 windows phone 不再.netframework 里面而是在 Microsoft Sdks 里面



文章参照了:

http://windobe.com/add-reference-In-Visual-Studio.aspx

http://support.microsoft.com/kb/815808/zh-cn#top

http://www.th7.cn/Program/delphi/2011/09/21/42175.shtml

http://www.cnblogs.com/boypig/archive/2011/10/26/2225355.html

更多相关文章
  • 


    		    SharePoint部署程序集DLL到GAC
    上一篇文章开发的SharePoint批量下载按钮用到了ICSharpCode.SharpZ
  • C#中泛型、程序集一些基本运用(Fifteenth Day)
    今天主要在学习了泛型和程序集以及一些细碎的知识的运用.下面我就把今天所学的总结一下. 理论:   泛型: * 英文名字是Generic,可以让多个类型共享一组代码,泛型允许我们声明类型参数化,可以用不同的类型进行实例化,也就是可以用类型占位符,创建具体类型值真实的概念. * C#中提供了五种泛型,分 ...
  • ASP.NET WebForm中異步請求防止XSRF攻擊的方法
    在ASP.NET MVC中微软已经提供了如何防止跨域攻击的方法.对于传统Webfrom中使用Handler来接受ajax的Post请求数据,如何来防止XSRF攻击呢.这里给大家提供一个简单地方法,和MVC中类似.   1.首先需要在你的站点中安装如下的nuget包.可以手动dll. Install-
  • 1.csc.exe是.net用来编译.cs文件的.一般来说在C:\Windows\Microsoft.NET\Framework\v2.0.50727 2.首先确认是否配置环境变量(当然,如果不配置也行,只不过要加上路径),如果没有,请按以下步骤配置(Window7) 右键点击"计算机&q ...
  • [VS软件版本号定义.规则和相关的Visual Studio插件](http://blog.csdn.net/cnhk1225/article/details/37500593)   [assembly: Assem
  • windows7安装phpnow Apache非管理员权限不能操作Windows NT服务的解决方法
    科普一下:PHPnow 是什么?       Win32 下绿色免费的 Apache + PHP + MySQL 环境套件包.简易安装.快速搭建支持虚拟主机的 PHP 环境,可以安装 Discuz!, WordPress 等程序.附带 PnCp.cmd 控制面板,幫助你快速配置你的套件,使用非常方便 ...
  • 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都实现了Map接口,以下方法适用于任何map实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)   方法一 在for-each循环中使用entries来
  • 错误提示:Fatal error: Call to undefined function mysql_connect() in D:\server\apache\htdocs\conn_mysql.php on line 3 解决方法: 只要在php配置文件中php.ini中开启mysql扩展和my ...
一周排行