GAC的一种非官方实现方式
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的一种非官方实现方式的更多相关文章
- VMware的三种网络连接方式区别
关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...
- 前端之float的几种清除浮动方式
前端之float的几种清除浮动方式 本节内容 1.float清除方式1 2.float清除方式2 3.float清除方式3 4.float清除方式4 1.float清除方式1 <!DOCTYPE ...
- ASP.NET MVC下的四种验证编程方式[续篇]
在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注Validation ...
- ASP.NET MVC下的四种验证编程方式
ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表,但是在真正执行目标Action方法之前,还需要对绑定的参数实施验证以确保其有效性,我们将针对参数的验证成为Model绑定 ...
- Hive几种数据导出方式
Hive几种数据导出方式 今天我们再谈谈Hive中的几种不同的数据导出方式.可以根据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统: (2).导出到HDFS中: (3).导出到Hi ...
- HTML5 Web 客户端五种离线存储方式汇总
最近折腾HTML5游戏需要离线存储功能,便把目前可用的几种HTML5存储方式研究了下,基于HT for Web写了个综合的实例,分别利用了Cookie.WebStorage.IndexedDB以及Fi ...
- jQuery中ajax的4种常用请求方式
jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...
- 用jQuery实现的一种网页内容呈现方式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
随机推荐
- Django之settings.py 的media路径设置
在一个 models 中使用 FileField 或 ImageField 需要以下步骤: 1. 在你的 settings.py文件中, 定义一个完整路径给MEDIA_ROOT 以便让 Django在 ...
- PEM_密钥对生成与读取方法
PS:欢迎转载,但请注明出处,谢谢配合. 前言: PEM是OpenSSL和许多其他SSL工具的标准格式,OpenSSL 使用PEM 文件格式存储证书和密钥.这种格式被设计用来安全的包含在ascii甚至 ...
- 浏览器对象模型(BOM)是什么?(体系结构+知识详解)(图片:结构)
浏览器对象模型(BOM)是什么?(体系结构+知识详解)(图片:结构) 一.总结 1.BOM操作所有和浏览器相关的东西:网页文档dom,历史记录,浏览器屏幕,浏览器信息,文档的地址url,页面的框架集. ...
- NOIP模拟 赌博游戏 - 概率dp
题意: 最近西雅图的高中校园里流行这样一个游戏. 我们有一个骰子,这个骰子有M个面,分别写着1..M,并且是个公平的骰子,换句话说,一次投掷时每个面朝上的概率是相同的. 游戏的组织者使用这个骰子进行N ...
- 【hdu 1846】Brave Game
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- 数据挖掘之分类算法---knn算法(有matlab样例)
knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法. 注意,不是聚类算法.所以这样的分类算法必定包含了训练过程. 然而和一般性的分类算法不同,knn算法是一种 ...
- [Angular] Difference between ngAfterViewInit and ngAfterContentInit
Content is what is passed as children. View is the template of the current component. The view is in ...
- UITableView的一些常用设置和代理方法
- (void)viewDidLoad { [super viewDidLoad]; tableview = [[UITableView alloc]initWithFrame:CGRectMake( ...
- 【9102】&&【a102】求a/b的高精度值
Time Limit: 10 second Memory Limit: 2 MB 问题描述 计算a/b的精度值,设a,b以一般整数输入,计算结果精确到小数后20位(结果四舍五入). Input 文件输 ...
- const常量用extern声明定义的问题(extern变量不能在使用类里初始化)
test.h #ifndef TEST_H_ #define TEST_H //常量声明和定义采取这种方法即可 const int a = 20; //不报错,因为const变量链接属性默认是内部链 ...