查看一个dll是否是强命名[C#]
使用命令行工具SDK Command Prompt,键入:SN -T C:\*****.dll
就会显示出该dll具体的PublicKeyToken 数值。
如果该程序集没有强命名,则不会有PublicKeyToken 数值。
将一个程序集强命名的方法是:
用SN -k C:\***.snk命令生成***.snk文件,将该snk文件加载到项目中。在项目上右键属性,选择Signing选项卡,钩选中“Sign the assembly”,再在下拉列表中选择刚才生成的***.snk,重新编译程序集。
此后,该程序集就被强命名了,它的PublicKeyToken 就有相应数值了。
注意要用大写的-T,不能用小写的。
公钥标记由应用程序签名时所用公钥的SHA-1哈希代码的最后8个字节表示
如何安排强命名过程集(Strong Name Assembly)和GAC
1. 如何创立强命名过程集(Strong Name Assembly)
创立一个强命名过程集率先必需获得一个用强命名实用工具
(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")]
解释:公钥/私钥对文件的伸展名能够是任意的(也能够未曾),因为编译的时候都是以元数据的款式读取的。
2. 过程集的安排措施
一个过程集有两种安排措施:
a) 私有措施
和利用过程安排在统一目录下的过程集称作私有安排过程集。弱命名过程集只能举行私有安排。
b) 大局措施
大局安排措施将过程集安排在一些CLR已确知的地方,当CLR搜查过程集时,它会懂获得这些地方去找。强命名过程集既能够举行私有安排,也能够举行大局安排。
3. 如何安排强命名过程集(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中也是不被激励的。八个容易的问题,穿插在同随时,业绩了一道“众口难调”的混杂的问题。
查看一个dll是否是强命名[C#]的更多相关文章
- 如何使一个你没有源代码的DLL文件变为强命名的DLL
转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗 ...
- 为已编译的DLL附带强命名
在我们开发的过程中,会经常调用其他人写好的DLL类库,由于种种的原因,不管是公司规定,还是个人习惯等等的原因,有时候需要调用各个类库直接邀请必须强命名. 但是我们临时也无法找到源代码进行重新编译等事情 ...
- .NET中查看一个强命名程序集(*****.dll)的PublicKeyToken的方法
使用命令行工具SDK Command Prompt,键入:SN -T C:\*****.dll (dll文件所在的路径) 就会显示出该dll具体的PublicKeyToken数值. 如果该程序集没有 ...
- 使用VS2010命令提示窗口操作程序集强命名
说明:文中示例均以将文件置于D盘根目录(D:\)下为例. 一.查看程序集是否具有强命名 sn -T d:\LicBase.dll 若有则会显示PublicKeyToken值,反之不会. 二.给无强命名 ...
- 多个DLL合并成一个DLL
多个DLL合并成一个DLL,把DLL合并到Exe中的解决方案 1:) 下载 http://download.microsoft.com/download/1/3/4/1347C99E-9DFB-425 ...
- 怎样从一个DLL中导出一个C++类
原文作者:Alex Blekhman 翻译:朱金灿 原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译 ...
- 为何.NET Core控制台项目发布后是一个dll文件,而不是exe文件?
项目中有一个.NET Core控制台项目叫ConsoleCoreApp,写好代码后准备发布: 结果发布后生成的是一个dll文件...为不是一个exe的可执行文件: 后来了解到.NET Core的项目分 ...
- 检测一个DLL文件是x64还是x86
对于一个DLL,我们如何判定其是32位的还是64位的,或者是any cpu的platform? Visual Studio提供了一个很好的工具:corflags,这个是内嵌到Developer Com ...
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码
参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...
随机推荐
- Vue路由获取路由参数
vue路由设置路由参数有2种方式: 1.通过query配置: <router-link :to="{ name:'login',query:{id:1} }">登录&l ...
- Selenium常用操作汇总二——iframe的处理
有时候我们在定位一个页面元素的时候发现一直定位不了,反复检查自己写的定位器没有任何问题,代码也没有任何问题.这时你就要看一下这个页面元素是否在一个iframe中,这可能就是找不到的原因之一.如果你在一 ...
- Linux 下如何处理包含空格和特殊字符的文件名
Linux 下如何处理包含空格和特殊字符的文件名 作者: Avishek Kumar 译者: LCTT zpl1025 | 2015-07-08 07:47 评论: 12 收藏: 9 分享: 1 ...
- Python 自定义异常处理Error函数
#!/usr/bin/env python # -*- coding:utf-8 -*- CODEMSG = { 2000: u"True", 4000: u"客户上传的 ...
- 利用函数或映射进行数据转换 (map)
先来看个数据 df = DataFrame({"food":["bacon", "pulled pork", "bacon&quo ...
- C艹函数与结构体
传递指针 代码: #include <iostream> #include <cmath> struct polar{ double distance; double angl ...
- 【转】【Python】Python发送邮件(常见四种邮件内容)
在写脚本时,放到后台运行,想知道执行情况,会通过邮件.SMS(短信).飞信.微信等方式通知管理员,用的最多的是邮件.在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮件服务软件或者调 ...
- 初步了解学习将传统单机应用改造成Dubbo服务的过程
Dubbo作为RPC框架,实现的效果就是调用远程的方法就像在本地调用一样.如何做到呢?就是本地有对远程方法的描述,包括方法名.参数.返回值,在Dubbo中是远程和本地使用同样的接口:然后呢,要有对网络 ...
- 浅析Android Camera开发中的三个尺寸和三种变形 (贡献一个自适配Picturesize和Previewsize的工具类)
转至 (http://blog.csdn.net/yanzi1225627/article/details/17652643) 经常听人问Camera开发中,各种变形问题,今天有空就在此梳理总结下. ...
- java 项目 存入mysql后 变问号 MySql 5.6 (X64) 解压版 1067错误与编码问题的解决方案
[参考]MySQL 5.7.19 忘记密码 重置密码 my.ini示例 服务启动后停止 环境 Java环境JDK1.8 安装好了 mysql-5.6.38-winx64 idea2016(64) ...