zhangchao19781124 / NET-STUDY

Take notes about Net Study
0 stars 0 forks source link

PublicKeyToken"程序集强命名"理解 #1

Closed zhangchao19781124 closed 6 years ago

zhangchao19781124 commented 6 years ago

PublicKeyToken
概念
官方说法法"程序集强命名"
目的
1.在全局程序集缓存(GAC)中部署的应用程序必须具有强名称,这样的话一个程序集如果注册到了GAC里,被其他程序集合引用的时候,将不会拷贝副本到引用的程序目录中
2.提高安全方面的防范
比方说,有的程序本来利用你写的DLL,被别人用一个同名的DLL覆盖了,程序假设不加分辨就使用这个DLL的话,可能就有安全问题了
程序强命名可以让开发人员有自己的私钥(sn命令),而这个私钥别人是不知道的。是保密的,在DLL开发的时候用私钥加密。而且把公钥信息写入到程序中
这个公钥就是所谓的PublicKeyToken.也就是说如果强命名的程序集被恶意覆盖了以后,调用方不知道,它启动时候依然用原来的
PublicKeyToken去调用,导致解析的新DLL无法加载,起到了对原来程序集的安全保障

PublicKeyToken生成
1 安装VS开发环境(本人VS2017)
2 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\Sn.exe文件是否存在

image

3 输入命令sn.exe -k 文件路径\文件名.snk,提示写入成功信息,进入路径确认是否生成指定.snk文件(该文件为私钥文件) image

4.复制私钥文件到需要生成程序集的工程下,也就是第一次生成的a.snk文件。

image

重新Rebuild工程,生成新的带Publictoken的dll文件~(≧▽≦)/~啦啦啦

5.PublicKeyToken获取 可以通过VS的外部工具来配置来获取 image

image

PublicKeyToken应用 目前主要是Web和应用程序两种,Web项目Web.config,应用程序项目来说App.config文件中引用程序集内容形式如下

<?xml version="1.0" encoding="utf-8" ?>

其中可能大家注意到了<bindingRedirect oldVersion= "2.0.0.0" newVersion= "3.5.0.0" />这样的内容,它表示如果项目中出现多个版本

的程序集比如项目中引用的是旧版本2.0.0.0时候,统一使用新的版本3.5.0.0 6.注册到GAC 通过Gacutil –I 强命名程序集 例如 Gacutil –I c:/V1/V1.dll 系统显示注册成功 这样其他应用程序利用这个GAC注册的DLL就不用在bin下存在这个DLL

7.引用程序集如何定义系统搜索路径