• GAC的一种非官方实现方式


    1.GAC简介

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

    2.感悟

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

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

     3.1 把程序集拷贝到C:WindowsMicrosoft.NETassemblyGAC_MSIL目录下

    3.2  在注册表的相应位置添加自定义项,并添加自定义键,其中32位操作系统注册表位置为SOFTWAREMicrosoft.NETFrameworkv4.0.30319AssemblyFoldersEx,64位操作系统注册表位置为                                                          SOFTWAREWow6432NodeMicrosoft.NETFrameworkv4.0.30319AssemblyFoldersEx

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

    4实现

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

    public class RegisterHelp
    
        {
    
            /// <summary>
    
            /// 根据操作系统位数,返回注册表响应位置
    
            /// </summary>
    
            /// <returns></returns>
    
            private static string GetRegistDoMain()
    
            {
    
                bool type = Environment.Is64BitOperatingSystem;
    
                if (type)
    
                {
    
                    return @"SOFTWAREWow6432NodeMicrosoft.NETFrameworkv4.0.30319AssemblyFoldersEx";
    
                }
    
                else
    
                {
    
                    return @"SOFTWAREMicrosoft.NETFrameworkv4.0.30319AssemblyFoldersEx";
    
                }
    
            }
    
     
    
            /// <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();
    
            } 
    
        }
  • 相关阅读:
    2017-3-13 SQL server 表连接
    2017-3-13 SQL server 函数(聚合函数,数学函数,字符串函数,转换函数,时间日期函数)
    2017-3-10 SQL server T-sql语句 高级查询
    2017-3-10 SQL server 数据库 T--SQL语句
    layer框架使用的问题汇总
    pulic——功能性(自己写完测试的)list转树
    bootstrap的datetimepicker使用(1.将默认的英文设置为中文2.选择日月年的时候记录之前的操作)
    临时笔记0318
    最简单的多线程代码,一句话就可以使用
    scrollview滑动到某区域执行某种方法
  • 原文地址:https://www.cnblogs.com/shanranlei/p/3629892.html
Copyright © 2020-2023  润新知