1.GAC简介

全局程序集缓存(Global Assembly Cache, GAC)计算机范围内的代码缓存,它存储专门安装的程序集,这些程序集由计算机上的许多应用程序共享。在全局程序集缓存中部署的应用程序必须具有强名称。.Net提供的命令行工具gacutil.exe用于支持这一功能。gacutil.exe可以将具有强名称的程序集添至全局程序集缓存。GAC位置一般在系统盘下Windows/Assembly目录下,如C:\Windows\assembly\。

2.感悟

在做项目中遇到一类需求:要求自己的类库在开发机上的VS中能直接引用,即需要注册到全局应用程序集。在调查的过程中发现有很多前辈提供的GACInstall,大部分都是调用了一大堆的系统的或者自定义的帮助类(有从OS级别的,有从VS级别的,有兴趣的可以网上搜索一下GACInstall)硬性要求都是以管理员运行,程序集必须是强名称,等等……。后来在对比过程发现,只要把程序集放在固定的目录,并且在注册表中注册到相应位置,即可实现GAC的安装。这中方式并不关心程序集是否已经强名称。当然这种方式违背了强名称的意义,但只要是我们自己的DLL的,又不关心知识保护,就无所谓了,所以我称之为非官方实现方式。

3实现流程(以.net4.0为例):

3.1 把程序集拷贝到C:\Windows\Microsoft.NET\assembly\GAC_MSIL\目录下

3.2  在注册表的相应位置添加自定义项,并添加自定义键,其中32位操作系统注册表位置为SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx,64位操作系统注册表位置为                                                          SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx

3.3自定义键,其名称必须是默认的(可能是因为注册表默认约定,系统的全局应用程序集,其键名称也全是默认),值为程序集所在文件夹路径

4实现

文件拷贝就不需要我多说了,我列举一下注册表的操作,当然注册表操作要求必须是管理员运行

public class RegisterHelp

    {

        /// <summary>

        /// 根据操作系统位数,返回注册表响应位置

        /// </summary>

        /// <returns></returns>

        private static string GetRegistDoMain()

        {

            bool type = Environment.Is64BitOperatingSystem;

            if (type)

            {

                return @"SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx";

            }

            else

            {

                return @"SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx";

            }

        }

        /// <summary>

        ///  以ID创建注册表项,并以默认名称,以组件路径为值创建创建注册表键

        /// </summary>

        /// <param name="businessId">ID</param>

        /// <param name="dllFloderPath">组件所在文件夹路径</param>

        public static void CreatRegistItem(string businessId, string dllFloderPath)

        {

            RegistryKey lm = Registry.LocalMachine;

            RegistryKey software = lm.OpenSubKey(GetRegistDoMain(), true);

            string itemName = "GTM.VisualPlatform.Component." + businessId;

            RegistryKey product = software.OpenSubKey(itemName, true);

            if (product == null)//判断某项是否存在

            {

                product = software.CreateSubKey(itemName);

            }

            if (product != null)

            {

                //product.GetValue(dllName)==null//判断某键是否存在

                //设置某个键的值,键不存在则会创建,存在则会赋值--此处不设置键值,采用默认,否则VS不认

                product.SetValue("", dllFloderPath);

            }

            lm.Close();

        } 

    }

GAC的一种非官方实现方式的更多相关文章

  1. VMware的三种网络连接方式区别

    关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...

  2. 前端之float的几种清除浮动方式

    前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.float清除方式1 <!DOCTYPE ...

  3. ASP.NET MVC下的四种验证编程方式[续篇]

    在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...

  4. ASP.NET MVC下的四种验证编程方式

    ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...

  5. Hive几种数据导出方式

    Hive几种数据导出方式 今天我们再谈谈Hive中的几种不同的数据导出方式.可以根据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统: (2).导出到HDFS中: (3).导出到Hi ...

  6. HTML5 Web 客户端五种离线存储方式汇总

    最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...

  7. jQuery中ajax的4种常用请求方式

    jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...

  8. 用jQuery实现的一种网页内容呈现方式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)

    主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...

随机推荐

  1. 嵌入式linux串口设置(一)

    在linux中,所有的设备文件一般都位于“/dev”下,串口1和串口2对应的设备名依次为“/dev/ttyS0”, “/dev/ttyS1”,而且USB转串口的设备名通常为“/dev/ttyUSB0” ...

  2. listener监听器笔记

    listener:三个域对象的监听器,,还有属性的变化. 监听三个域对象的创建和销毁:servletContextListenerservletRequestListenerservletsessio ...

  3. 蓝牙简单配对(Simple Pairing)协议及代码流程简述

    kangear注: 文章转自:http://blog.csdn.net/myxmu/article/details/12217135 原文把图给搞丢了.可是文章太好了,这个时候我就发挥多年的Googl ...

  4. nodejs版本号更新问题:express不是内部或外部命令

    版本号更新后,我们使用熟悉的npm install -g express命令安装,可是,成功安装之后竟然提示express不是内部或外部命令. nodejs小问题:[1]express不是内部或外部命 ...

  5. C++ 如何快速清空vector以及释放vector内存?

    平时我们在写代码时候,有思考过要主动去释放vector的内存吗? 1.对于数据量不大的vector,没有必要自己主动释放vector,一切都交给操作系统. 2.但是对于大量数据的vector,在vec ...

  6. php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数?

    php如何利用标准输入输出实现在一个字符串中计算某个字符出现的个数? 一.总结 php实现计算字符个数(php标准输入和输出:fgets(STDIN)  echo $output;) 1.php标准输 ...

  7. 网络异常与SQL Server事务

    SQL Server事务遭遇网络异常时的处理机制浅析 SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Se ...

  8. php如何实现读取网易有道词典输出单词的xml格式并且转化为html形式

    php实现读取网易有道词典输出单词的xml格式并且转化为html形式 一.总结 一句话总结:将xml中的文件用preg_match_all读出来,然后组合成想要的数据 1.explode除了爆炸的意思 ...

  9. ubuntu14.04下unix网络编程 环境的配置

    在ubuntu下 首先:在unpv13e文件加下 ./configure cd lib make cd ../libfree make cd ../liggai make cd .. vim lib/ ...

  10. 拉伸按钮背景图片:stretchableImageWithLeftCapWidth:

    // 1. 拉伸按钮背景图片 // 1) 登录按钮 UIImage *loginImage = [UIImage imageNamed:@"LoginGreenBigBtn"]; ...