查看一个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 ...
随机推荐
- js 获取地址栏最后一个文件名称
var JsRequest={ //这就是一个静态类,类里面有2个静态方法 //方法一:获取url的文件名 例如 index.html getUrlname:function(url){ //假如传进 ...
- R-Sys.time计算程序运行时间
R用Sys.time()可以查看当前系统时间程序开始时记录: timestart<-Sys.time()程序临结束时记录: timeend<-Sys.time()程序运行时间: runni ...
- Sword protobuf学习一
protobuf简介 Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 它不依赖于语言和平台并且可扩展性 ...
- GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。
Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...
- jsp页面利用JS做即时时间显示
想给系统多些点缀,顺便把知识点温习一遍,不过讲真,这些都是网上扒的!我的水平现在也就这样 <%@page import="javax.xml.crypto.Data"%> ...
- substitute 命令与 global 命令
他们是很强大的EX命令: substitute的格式: :[range]s[ubstitute]/{pattern}/{string}/{flags} 其中的patttern 指的是正则表达式的匹配: ...
- 数据抓取的艺术(三):抓取Google数据之心得
本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间 时间是一个与抓取规模相形而 ...
- ubuntu 系统启动异常之无登录界面和版本号启动四个点的地方卡住
zlib 搞的鬼,还没结局,由于rtmpdump 安装需要安装独立zlib库,装完后重启,完了吓一跳,卡住,尼玛这一年的代码都在里面啊!!! ldd /usr/sbin/python 查询库依赖zli ...
- (转)FFmpeg源代码简单分析:avformat_find_stream_info()
目录(?)[+] ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结 ...
- spring oxm入门(包含demo)
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...