标签:
本章大概讲了早起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头里面
这样就算你名字一样,也能知道是不一样的程序集。
一个程序集需要被多个程序引用。
一种办法是你一个一个复制,另一个就全局程序集。
当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
标签:
原文地址:http://www.cnblogs.com/HeyTommy/p/4309449.html