惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
量子位
D
DataBreaches.Net
博客园 - 司徒正美
J
Java Code Geeks
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
B
Blog
The Cloudflare Blog
D
Docker
I
InfoQ
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
腾讯CDC
月光博客
月光博客
Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
S
SegmentFault 最新的问题
GbyAI
GbyAI
有赞技术团队
有赞技术团队

博客园 - 带你去月球

【美食技术】家庭自制DIY鸡蛋饼和疙瘩汤早餐视频教程 部分组件无法创建,Scripting.FileSystemObject(FSO)对象的建立基础! Market info 2 LCID. c++ 函数指针 SQL索引 什么是win32编程 DHCP请求IP地址的过程 Ipconfig 用法 cd /d %~dp0是什么意思啊? 什么是托管 C#的内存管理:堆栈、托管堆与指针 存储过程 如何获得数据库里所有表的名字 C#值类型与引用类型的区别 _2 值类型跟引用类型的区别 simple reflection .net framework introduction 禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项。 - 带你去月球 system.exe HBKernel32.sys ace1f7.sys 手动清除 病毒
GAC&&强命名 - 带你去月球 - 博客园
带你去月球 · 2008-11-02 · via 博客园 - 带你去月球

GAC

强名的作用是识别篡改、防止dll冲突。

GAC中的所有的Assembly都会存放在系统目录"%winroot%\assembly下面。放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问。  
   
  关于GAC本身,GAC全称是Global   Assembly   Cache,他的作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。这样,很多程序就可以从GAC里面取得Assembly,而不需要再把所有要用到的Assembly都拷贝到应用程序的执行目录下面。举例而言,如果没有GAC,那么势必每个WinForm程序的目录下就都要从C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷贝一份System.Windows.Forms.dll,这样显然不如都从GAC里面取用方便,也有利于Assembly的升级和版本控制。  
   
  除了系统默认放置在GAC中的Assembly如System.Windows.Forms以外,我们也可以添加自己的Assembly:   

1 1)创建一个strong-name的Assembly,例如ToolbarComponent.dll   
2   2)运行gacutil   -i   ToolbarComponent.dll,把这个Assembly添加到GAC   
3   3)在程序中动态装载:   
4   System.Reflection.Assembly   ass=Assembly.Load("ToolbarComponent,   Version=1.0.934.20434,   Culture=neutral,   PublicKeyToken=65f45658c8d4927f");   
5   MessageBox.Show("Is   the   assembly   loaded   from   GAC?   "+ass.GlobalAssemblyCache);   
6 

  在上面的程序中,ToolbarComponent就是从GAC装载而不是从程序的运行目录下的dll文件中装载,程序目录下不需要放置ToolbarComponent.dll程序也能正常运行。另外,Assembly.Load()中的参数可以通过"gacutil   -l"查到。   
    

Code


    
  MSDN中有一些对GAC的介绍,您可以参考:  
  1)《Assembly   Cache   Viewer   (Shfusion.dll)》  
  2)《Global   Assembly   Cache》  
   
  .NET   Framework中附带了一些和GAC有关的工具,其中包括:  
  1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly  
  2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native   Image  
  3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。

 强命名程序集(Strong Name Assembly)的概念

  因为不同的公司可能会开发出有相同名字的程序集来,如果这些程序集都被复制到同一 个相同的目录下,最后一个安装的程序集将会代替前面的程序集。这就是著名的Windows “DLL Hell”出现的原因。

  很明显,简单的用文件名来区分程序集是不够的,CLR需要支持某种机制来唯一的标识一个程序集。这就是所谓的强命名程序集。

  一个强命名程序集包含四个唯一标志程序集的特性:文件名(没有扩展名),版本号,语言文化信息(如果有的话),公有秘钥。

  这些信息存储在程序集的清单(manifest)中。清单包含了程序集的元数据,并嵌入在程序集的某个文件中。

 1   下面的字符串标识了四个不同的程序集文件:
 2 
 3 
 4   “MyType, Version=1.0.1.0,
 5 
 6 
 7   Culture=neutral, PublicKeyToken=bf5779af662fc055”
 8 
 9 
10   “MyType, Version=1.0.1.0,
11 
12 
13   Culture=en-us, PublicKeyToken=bf5779af662fc055”
14 
15 
16   “MyType, Version=1.0.2.0,
17 
18 
19   Culture=neturl, PublicKeyToken=bf5779af662fc055”
20 
21 
22   “MyType, Version=1.0.2.0,
23 
24 
25   Culture=neutral, PublicKeyToken=dbe4120289f9fd8a”
26 

  如果一个公司想唯一的标识它的程序集,那么它必须首先获取一个公钥/私钥对,然后将共有秘钥和程序集相关联。不存在两个两个公司有同样的公钥/私钥对的情况,正是这种区分使得我们可以创建有着相同名称,版本和语言文化信息的程序集,而不引起任何冲突。

  与强命名程序集对应的就是所谓的弱命名程序集。(其实就是普通的没有被强命名的程序集)。两种程序集在结构上是相同的。都使用相同的PE文件格式,PE表头,CLR表头,元数据,以及清单(manifest)。二者之间真正的区别在于:强命名程序集有一个发布者的公钥/私钥对签名,其中的公钥/私钥对唯一的标识了程序集的发布者。利用公钥/私钥对,我们可以对程序集进行唯一性识别、实施安全策略和版本控制策略,这种唯一标识程序集的能力使得应用程序在试图绑定一个强命名程序集时,CLR能够实施某些“已确知安全”的策略(比如只信任某个公司的程序集)。