查看一个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中也是不被激励的。八个容易的问题,穿插在同随时,业绩了一道“众口难调”的混杂的问题。

原文地址:https://www.cnblogs.com/poissonnotes/p/3357581.html