一 首先    程序集(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”对话框会列出来一些程序集引用。那么如何把自己的程序集也添加到这里呢?

 
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目录下
 
2.创建注册表键和键值[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v2.0.50727\AssemblyFoldersEx\testDll]@="c:\test\"
 
3.重新打开VS,添加引用,在弹出的“Add Reference”对话框中,如果工程的目标.NET Framework是在v2.0.50727版本以上,你会看到TestAddReference
 

 

需要注意点:

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

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

转自:https://www.cnblogs.com/boypig/archive/2011/10/26/2225355.html

dll安装到GAC以及引用的方法【转】的更多相关文章

  1. 未能添加对***.dll的引用 问题解决方法

    这个不是什么新问题了,这里说一下我遇到的这个操蛋事. 转载请注明出处 http://www.cnblogs.com/zaiyuzhong/p/6236263.html 我做的和往常一样,找到SDK开发 ...

  2. vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装。的解决方法

    vmware tools安装程序无法继续,Microsoft Runtime DLL安装程序未能完成安装.的解决方法_华英雄_新浪博客 http://blog.sina.com.cn/s/blog_5 ...

  3. sharepoint 使用命令行注册dll文件到gac的方法

    使用命令行注册dll文件到gac的方法: gacutil.exe -i D:\SPFormLoginProject.dll 删除gac的dll方法: gacutil /u "SPFormLo ...

  4. 将WinForm程序(含多个非托管Dll)合并成一个exe的方法

    原文:将WinForm程序(含多个非托管Dll)合并成一个exe的方法 开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. ILMerge能把托管dl ...

  5. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  6. 将.NET dll注册到GAC(Global Assembly Cache)中

    当发现有多个解决方案引用一个dll时,为了不重复引用所以将.net的一个dll注册到GAC中去. gacutil.exe. 记得使用管理员权限打开 开始菜单-Microsoft Visual Stud ...

  7. wamp下安装php的xdebug调试的方法

    wamp下安装php的xdebug调试的方法 将下载好的php_xdebug-2.1.2-5.2-vc6.dll放在D:/wamp/php/ext/php_xdebug-2.1.2-5.2-vc6.d ...

  8. C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法

    使用反射(Reflect)获取dll文件中的类型并调用方法 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static v ...

  9. 安装office2010提示要安装MSXML6.10.1129.0解决方法

    系统win7 32位 安装office2010出现了错误,提示要安装MSXML6.10.1129.0解决方法 1.下载MSXML6.10.1129.0进行安装 2.若本机已安装过不管用: a.在运行里 ...

随机推荐

  1. Bitmap之extractAlpha函数抽取alpha值

    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; i ...

  2. java@ 注解原理与使用

    Java反射 java反射机制的定义: 在运行转态时(动态的)时. 对于任意一个类,都能够知道这个类的所有属性和方法 对于任意一个对象,都能够知道调用它的任意属性和方法 Class对象 java中用对 ...

  3. Python2和Python3的字符串编码和类型

    一.字符串编码和类型 任何编码格式的字符串,都可以和Unicode互相转换. gbk -> utf8 # 将字符串按指定格式进行解码,返回Unicode字符串unicode_str = gbk_ ...

  4. PAT 甲级 1041 Be Unique (20 分)(简单,一遍过)

    1041 Be Unique (20 分)   Being unique is so important to people on Mars that even their lottery is de ...

  5. Java中将一个反斜杠转换成两个反斜杠

    代码示例: s = s.replaceAll("\\\\", "\\\\\\\\");

  6. LINQ语法详解

    我会通过一些列的实例向大家讲解LINQ的语法. 先创建一个Person类,作为数据实体 public class Person { public string Name { get; set; } p ...

  7. [opencv] copyTo函数的使用方法

    OpenCV中image.copyTo()有两种形式: 1.image.copyTo(imageROI),作用是把image的内容粘贴到imageROI: 2.image.copyTo(imageRO ...

  8. iOS技术面试01:多线程与网络

    1. 多线程的底层实现? 1> 首先搞清楚什么是线程.什么是多线程.多线程的使用场合(线程有时被称为轻量级进程,是程序执行流的最小单元.多线程是指软件或者硬件实现多个线程并发执行的技术.多线程的 ...

  9. Hadoop概念学习系列之Hadoop、Spark学习路线

    1 Java基础: 视频方面:          推荐<毕向东JAVA基础视频教程>.学习hadoop不需要过度的深入,java学习到javase,在Java虚拟机的内存管理.以及多线程. ...

  10. 基于OpenCV的同态滤波

    在4.0.1节中,我们已经介绍了一个简单的图像形成模型,即照射-反射模型.这个模型可以开发一种频率处理程序,该程序可以同时压缩灰度范围和增强对比度来改善一幅图像的表现.图像形成的照射-反射模型的表达式 ...