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. [Node.js] Test Node RESTful API with Mocha and Chai

    In this lesson, we will use Chai's request method to test our Node application's API responses.By th ...

  2. Android 使用Canvas在图片上绘制文字

    一个小应用,在图片上绘制文字,以下是绘制文字的方法,并且能够实现自动换行,字体自动适配屏幕大小 private void drawNewBitmap(ImageView imageView, Stri ...

  3. 三次握手、四次握手、backlog

    TCP:三次握手.四次握手.backlog及其他   TCP是什么 首先看一下OSI七层模型: 然后数据从应用层发下来,会在每一层都加上头部信息进行封装,然后再发送到数据接收端,这个基本的流程中每个数 ...

  4. const常量用extern声明定义的问题(extern变量不能在使用类里初始化)

    test.h #ifndef TEST_H_ #define TEST_H //常量声明和定义采取这种方法即可 const int a = 20;  //不报错,因为const变量链接属性默认是内部链 ...

  5. hadoop 3.x 关闭安全模式

    hdfs启动后发现进入了安全模式,最开始使用hdfs dfsadmin -safemode leave来进行关闭发现无法关闭,只好使用hdfs dfsadmin -safemode forceExit ...

  6. KindEditor4.1.10,支持粘贴图片

    转载自https://blog.csdn.net/jimmy0021/article/details/73251406 我已经忘记我是不是从这个博主的那里找到的解决kindeditor粘贴图片的方法了 ...

  7. Topshelf组件

    使用Topshelf组件构建简单的Windows服务   很多时候都在讨论是否需要了解一个组件或者一个语言的底层原理这个问题,其实我个人觉得,对于这个问题,每个人都有自己的看法,个人情况不同,选择的方 ...

  8. Android GPS获取当前位置信息

    package com.example.gpstest; import org.apache.http.util.LangUtils; import android.content.Context; ...

  9. STL关联式容器之set和multiset

    一,set和multiset的基础知识 1.set和multiset的基础 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按照一定的顺序排列,元素插入过程是按照排序规则插入的.所以不能指 ...

  10. Leetcode 617 Merge Two Binary Trees 二叉树

    题意: 给定两棵树,将两棵树合并成一颗树 输入 Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出 合并的树 3 / \ 4 5 / \ \ 5 4 7 ...