关于强命名程序集
创建一个强命名程序集首先需要获得一个用强命名实用工具
(Strong Name Utility,即SN.exe,.NET SDK自带)产生的密钥。
下面简要介绍一下SN.exe的一些用法。 要产生一个公钥/私钥对:
a)SN –k MyCompany.Keys
该命名告诉SN.exe创建一个名为MyCompany.keys的文件。MyCompany.keys文件将包含以对以二进制格式存储的公有密钥和私有密钥。
b)查看公有密钥:
首先生成一个只包含公有密钥的文件: SN –p
MyCompany.keys MyCompany.PublicKey
然后用-tp参数查看:SN –tp MyCompany.PublicKeys
Public key is
00240000048000009400000006020000002400005253413
10004000001000100bb7214723ffc13901343df4b9c464ebf
7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731d
beb83b869f0509bf8009e90db5c8728e840e782d2cf928dae
35c2578ec55f0d11665a30b37f8636c08789976d8ee9fe9a5
c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93
df37d7e85f9a0104a5845053995ce8
Public key token is 2dc940d5439468c2
创建好了公钥/私钥对,创建强命名程序集就很容易了。只需要把System.Reflection.AssemblyKeyFileAttribute特性加入到源代码中就可以了:?[assembly:AssemblyKeyFile("MyCompany.keys")]
说明:公钥/私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。
4.程序集的部署方式
一个程序集有两种部署方式:
a)私有方式
和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。
b)全局方式
全局部署方式将程序集部署在一些CLR已确知的地方,当CLR搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。
5.如何部署强命名程序集(Strong Name Assembly)和GAC
a)GAC的概念
如果一个Assembly要被多个应用程序访问,那么他就必须放在一个CLR已确知的目录下,并且CLR在探测到有对该Assembly的引用时,它必须能自动到该目录下寻找这个程序集。这个已确知的目录称作GAC(Global Assembly Cache),就是全局程序集缓存。它一般位于下面的目录下:<System Drive>:/Windows/Assembly/GAC。
GAC的作用就是提供给CLR一个已知的确定的目录去寻找引用的 程序集。
b)GAC的内部结构
GAC是一个特殊的结构化的目录,用Windows Explorer浏览你会以为它只是一个包含很多程序集的普通目录。其实不是这样的,在命令行下查看,你会发现它实际上包含很多子目录,子目录的名字和程序集的名称是相同的,但它们都不是实际的程序集,实际的程序集位于程序集名对应的目录下。比如进入GCFWK子目录,我们会发现其中又有很多的子目录。机器内每一个安装到GAC的GCFWK.dll在GCFWK中都会有一个子目录。
这里只 有一个目录表明只有一个版本的GCFWK程序集被安装。实际的程序集保存在每一个对应的版本目录下。目录的名称以下划线的形式分割为“(Version)_(Culture)_(PublicKeyToken)”。
GCFWK的语言文化信息为netture,就表示为0.0.0__bf5779af662fc055”。 表示得意义是: “GCFWK, Version=1.0.0.0, Culture=neutral,PublicKeyToken=bf5779af662fc055” 如果语言文化信息为”ja”,就表示”1.0.0.0_ja_bf5779af662fc055”
表示得意义是: “GCFWK, Version=1.0.0.0, Culture=ja, PublicKeyToken=bf5779af662fc055”
c)部署强命名程序集到GAC
GAC包含很多子目录,这些子目录是用一种算法来产生的,我们最好不要手动将程序集拷贝到GAC中,相反,我们应使用工具来完成这样的工作。因为这些工具知道GAC的内部结构J
在开发和测试中,最常用的工具就是GACUtil.exe。 在GAC中注册程序集跟COM注册差不多,但相对更容易:
1.把程序集添加到GAC中: GACUtil /i sample.dll (参数/i是安装的意思)
2.把程序集移出GAC GACUtil /u sample.dll (参数/u就移除的意思)
注意:不能将一个弱命名程序集安装到GAC中。
如果你试图把弱命名程序集加入到GAC中,会收到错误信息:”
Failure adding assembly to the cache: Attempt to install an assembly without a strong name”
d)强命名程序集的私有部署
把程序集安装到GAC有几个好处。首先,GAC使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到 GAC中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为1.0.0.0程序集的程序,通过更改它的配置文件,转而让程序去引用版本为2.0.0.0的程序集)来使用新版本;最后,GAC还提供了对不同版本程序集的并存(side-by-side)管理方式。但是,GAC的安全策略通常只允许管理员更改,同时,向GAC中安装程序集也破坏了.NET框架的简单拷贝部署的许诺。
除了向GAC或者以私有部署方式部署强命名程序集之外,我们还可以将强命名程序集部署在仅为一小部分程序知道的某个任意目录下。配置每一个应用程序的 XML配置文件,让它们指向一个公有目录,这样,在运行时,CLR将知道到哪里去找这个强命名程序集。但这样又有可能会引发”DLL Hell”的问题,因为没有哪个程序可以控制这个程序集何时被卸载。这在.NET中也是不被鼓励的。
生成公钥与私钥对,并对私钥做严格的保护
生成:sn -k keyfile.snk 公钥与私钥对
抽取公钥:sn -p keyfile.snk public.snk 从keyfile中抽取公钥保存到public.snk文件中,以对程序集进行迟签名
跳过验证:sn -Vr assembly 对assembly在开发用机上进行跳过验证处理,该assembly不是已签名的
签名:sn -r assembly keyfile.snk 对assembly 进行迟签名,这一步是在发布之前做
取消跳过验证:sn -Vu assembly 对assembly在开发用机上取消跳过验证,该assembly这时是已签名的
或取消所有:sn -Vx 取消所有验证
开发阶段
assembly不是已签名的,但是强命名的strong named,因此需要在开发机上做跳过验证处理
发布阶段
由私钥控制者对assembly进行签名,并在开发机上由开发人员自行取消跳过验证
相关文章:

get the better of sb
2019独角兽企业重金招聘Python工程师标准>>> get the better of sb 克服,占上风,打败 › to defeat someone in a competition:He fought fiercely, but his opponent easily got the better of him.› If a feeling gets the better of you…

安谋中国推出“山海” S12,AIoT 安全解决方案技术全解读
近日,安谋中国推出了自主研发的AIoT全栈安全解决方案“山海”S12,可应用于智能手机、平板、智能电视及安防等行业,为安全解决方案如数字版权保护、AI 安全、身份认证等提供基础安全能力。 据了解,此前安谋中国自研处理器IP已经推出…

js canvas游戏初级demo-上下左右移动
大概流程就是监听状态变化擦除画布重绘 由于js监听时间变化的函数addEventListener只能达到每秒触发20次左右,也就是每秒20帧,看起来有点卡卡的 所以用定时器搞到每秒30帧 按上下左右键可以移动砖块 <!DOCTYPE html> <html lang"en"&…

判断一个IP区间(或IP)是否被另一个IP区间所包含
以下方法实现判断一个IP是否被一个IP区间所包含 有一些静态方法可能引用了同名空间的自定义的类, 至于合并两个相临的IP段,可对其中的最大或最小IP1 using System;using System.Text.RegularExpressions; namespace HKH.Common{ /// <summary>…

制作OpenStack上使用的CentOS系统镜像
很多进行Openstack测试的人都发现,自己的openstack测试环境搭建的很成功,安全策略也添加了,但是上传镜像之后,却出现无法Ping通,无法ssh到实例等问题,实际上这很可能是由于我们没有使用一个正确的镜像导致的…

从最强AI算力到“元脑”2.0,智算加速产业变革
作者 | Just出品 | AI科技大本营(ID:rgznai100)AI模型的数据量、结构的复杂程度不断增加,带来了大规模AI算力的庞大需求。2020年7月,OpenAI实验室推出拥有1750亿参数的NLP模型GPT-3,其训练数据集规模超过500GB…

动态规划和分治法,贪心算法以及递归的再一次深刻理解和体会
每次体会算法都有新的感觉,刷题越多,对算法的理解感觉也就越深刻。下面我们来重新体会下分治法,动态规划,贪心法,递归的理解。1.分治法:将问题分成单独的阶段,每个阶段互相不干扰很独立…

基于注解的设计模式
2019独角兽企业重金招聘Python工程师标准>>> http://alexradzin.blogspot.com/2013/01/annotation-based-design-patterns.html 转载于:https://my.oschina.net/heatonn1/blog/204789

提气!清华成立集成电路学院,专研“卡脖子”技术
整理 | 寇雪芹头图 | 下载于ICphoto出品 | AI科技大本营(ID:rgznai100)今天上午,清华大学举行了集成电路学院揭牌仪式,党委书记陈旭宣读了学院成立决定并致辞表示,集成电路学院为学校实体教学科研机构&…

第一本的java 的小总结
1.Java常见的注释有哪些,语法是怎样的? 1)单行注释用//表示,编译器看到//会忽略该行//后的所文本 2)多行注释/* */表示,编译器看到/*时会搜索接下来的*/,忽略掉/* */之间的文本。 3)文档注释用/** */表示࿰…

WMI Series :事件预订和处理
WMI事件概述对于从事Winows编程的开发人员来说,事件驱动的应用程序设计是再熟悉不过了,但是WMI中的事件又是一个什么样的概念呢?对于宝贵的内存和CPU资源,管理员需要不断的监视其性能;对于磁盘而言,我们需要…

如何记录2秒内实现1800度转体+翻腾,百度智能云黑科技教你看懂跳水
百度智能云与中国国家跳水队协同推进人工智能与体育跨界合作再进一步,正在为我国AI体育的应用探索开拓一片新的大陆。4月22日,百度与中国国家跳水队举行合作启动仪式,百度智能云正式成为中国国家跳水队独家AI合作伙伴,助力中国跳水…

python 多线程日志切割+日志分析
楼主最近刚刚接触python,还是个小菜鸟,没有学习python之前可以说楼主的shell已经算是可以了,但用shell很多东西实现起来还是不可能的事情,例如最明显的一点大日志分析,由于楼主的公司,每天的日志量很大&…

redis入门(03)redis的配置
一、配置文件 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。你可以通过 CONFIG 命令查看或设置配置项。 二、查看修改 1、查看配置 1.1、vi redis.conf 1.2、redis 127.0.0.1:6379> config get CONFIG_SETTING_NAME 2、修改配置 2.1、vi redis.c…

WMI Series :管理对象的信息查询和方法访问
管理对象的信息查询和方法访问在这一节内容,我们将通过几个实例来学习如何查询管理对象信息和访问管理对象提供的方法,这一部分内容将使用到我们在前面讲述到的System.Management命名空间中的相关类对象。管理对象的信息查询管理对象的信息查询有两种方式…

穿山甲发布聚合产品GroMore,为开发者变现赋能
近日,穿山甲发布聚合产品「GroMore」,该产品整合多个主流广告平台资源,支持App开发者将广告请求同时发送至多个平台,并根据各平台的出价能力,合理分配流量,最终达到广告收益最大化的目的。聚合产品在海外市…

使用SQLServer配置管理器配置SQLServer数据库引擎实例,以便侦听特定的固定1433端口。...
最近在安装SQLServer2012 SP1的时候,初始安装的情况下开启的是动态端口,为了使远程服务器连接到SQlServer我们需要开启固定的1433端口。 默认的端口状态。 开启的方法 配置相关的SQL实例的网络配置 重启SQLServer服务 查看一下端口状态 转载于:https://b…

P1194 买礼物
P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么…

.NET 框架中的 WMI 命名空间
.NET 框架中的WMI 命名空间.NET框架中与WMI规范有关的命名空间有两个,分别是System.Management和System.Management.Instrumentation两个命名空间。其中System.Managemen命名空间提供的类对象为访问各种管理对象提供了面向对象的编程接口,而System.Management.Instr…

一个已经存在 10 年,却被严重低估的库!
来源 | 写代码的明哥头图 | 下载于视觉中国今天介绍的是一个已经存在十三年,但是依旧不红的库 decorator,好像很少有人知道他的存在一样。这个库可以帮你做什么呢 ?其实很简单,就是可以帮你更方便地写 python 装饰器代码ÿ…

linux_shell 第一章 变量
2019独角兽企业重金招聘Python工程师标准>>> #!/bin/sh //解释器 a"1"; //对a进行赋值,等号两边不能有空格,以冒号("")方式传入,变量不需要先定义即可使用 b"2;" string"…

让vim不要自动添加新的注释行
vim里面有一个特性,如果你在一行注释后新加一行,vim会自动在下一行的开始位置添加注释符号。例如对于C/C来说 //This is a comment line// 第二行的"//"符号就是vim自动添加的。如果是在大量编写注释,…

WMI使用技巧集
WMI使用技巧集 很多的朋友对WMI可能见过但理解不深,我也是十分想了解关于WMI的知识,可一直找不对太合适的资料,在网上的一些资料不是有很多错误,就是讲解不清,我有空的时候将关于WMI的知识集中一下,放在这…

如果不被吐槽,那我还是程序员吗
一组漫画看看中美两国程序员的差别网友:不能更形象了... 本文原创公众号:不会笑青年 60专家,13个技术领域,CSDN 《IT 人才成长路线图》重磅来袭!直接扫码或微信搜索「CSDN」公众号,后台回复关键词「路线图」…

Symantec BE 12.5 备份Exchange错误排除
备份时,提示以下错误:最终错误: 0xe0008703 - 作业失败于自身测试运行。解决方法:先备份本地的很小的文件(不是测试备份),成功后,再测试Exchange的备份。以下是官网的详细解答。http://www.syma…

oc75--不可变字典NSDictionary
// // main.m // NSDictionary // //#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {// 1.如何创建NSDictionary *dict1 [NSDictionary dictionaryWithObject:"lnj" forKey:"name"];NSString *name1 [dict1 object…

特殊SQL语句及优化原则
1.按姓氏笔画排序:Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密:select encrypt(原始密码)select pwdencrypt(原始密码)select pwdcompare(原始密码,加密后密码) 1--相同;否则不相同 encrypt(原始密码)select pw…

以AI制作AI,当AutoML加入AI研究员内卷大潮
导读:「深度赋智」首推以知识驱动的全自动机器学习架构,应用于2020四月结束的国际自动机器学习领域的顶级赛事 NeurIPS-AutoDL竞赛,并以压倒性优势获得世界冠军,相关论文于近日被人工智能顶刊IEEE TPAMI接收。 「深度赋智」一直专…

oracle 导入数据
1.在数据库中建立实例数据库之后,运行cmd 2.键入 imp空格(实例数据库名)/(实例数据库口令)空格file“拖入数据地址” 比如czt.dmp文件直接拖进去(空格)fully 3.按enter建转载于:https://www.cnblogs.com/dieyaxianju/p/3593522.html

C#隐藏手机号中间四位为*
使用正则:Regex.Replace(手机号, "(\\d{3})\\d{4}(\\d{4})", "$1****$2"); 效果: