码迷,mamicode.com
首页 > 其他好文 > 详细

03 共享程序集和强命名程序集

时间:2015-03-05 18:39:00      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

 

本章大概讲了早起Windows DLL Hell问题。

并且讲目前.net机制如何解决他的

本书提出了 强命名 和 弱命名程序集的概念.

 

首先他们都是程序集,在本质上并没有区别.

唯一的区别是

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

他不仅仅只是按照文件名来区分程序集。

 

这样就算两个公司同样名字的 Common.dll 的程序集。 也会因为 版本号,语言,PublicKeyToken的区别区分开.

 

1. 生成签名

原生的程序集是不附带PublicKeyToken之类信息的。

需要自己去生成

微软提供了SN.exe 这样一个工具来生成 公钥/私钥 , 语法

技术分享

技术分享

 

查看生成的 公钥

技术分享

 

用签名生成对应的程序集

技术分享

用ILDASM.exe 看一下

技术分享

技术分享

publickey 和 在CMD打印出来的publickey 一致

 

同样你可以使用 VS 来生成

技术分享

然后生成 找到对应的DLL

技术分享

 

内部流程

技术分享

 

公钥就是Publickey

然后用 根据Manifest文件清单 生成hash值。算法使用 SHA-1

hash值使用私钥进行签名,得到 RSA 数字签名,保存到CLR头里面

 

这样就算你名字一样,也能知道是不一样的程序集。

 

2. 全局程序集。

一个程序集需要被多个程序引用。 

一种办法是你一个一个复制,另一个就全局程序集。

当CLR有着该程序集的引用时,就会检索该文件夹

3.5 以前 C:\Windows\Assembly

4.0 C:\Windows\Microsoft.NET\Assembly

弱命名程序集,也就是没有签名的程序集 不能被添加到这里.

 

C:\Windows\Microsoft.NET\Assembly 下

文件会按照

文件名 - (Version)_(Culture)_(PublicKeyToken) - 具体文件的目录放置。 以免不正确的覆盖.

 

技术分享

技术分享

具体的语法可以点击这里

 

安装时,会根据 程序集清单 重新生成对应的RSA数字签名进行对比, 如果发现不一致,则程序集被修改。

通过公钥的对比,也能够确认是否是原作者提供的DLL.

 

这种方式

1. 避免了重名文件的胡乱覆盖。

2. 管理方便,更换程序集只需要更改配置

3. 只有管理员能够添加和卸载 全局程序集。 安全性方面也有一定的保证

 

PS:全局程序集缓存只是在运行的时候才会调用。

 

 END

 

03 共享程序集和强命名程序集

标签:

原文地址:http://www.cnblogs.com/HeyTommy/p/4309449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!