`
caozuiba
  • 浏览: 902696 次
文章分类
社区版块
存档分类
最新评论

关于强命名程序集

 
阅读更多
如何创建强命名程序集(StrongNameAssembly

创建一个强命名程序集首先需要获得一个用强命名实用工具
StrongNameUtility,即SN.exe.NETSDK自带)产生的密钥。
下面简要介绍一下SN.exe的一些用法。要产生一个公钥/私钥对:

a)SN–kMyCompany.Keys
该命名告诉SN.exe创建一个名为MyCompany.keys的文件。MyCompany.keys文件将包含以对以二进制格式存储的公有密钥和私有密钥。

b)
查看公有密钥:
首先生成一个只包含公有密钥的文件:SN–p
MyCompany.keysMyCompany.PublicKey
然后用-tp参数查看:SN–tpMyCompany.PublicKeys
Publickeyis

00240000048000009400000006020000002400005253413

10004000001000100bb7214723ffc13901343df4b9c464ebf

7ef4312b0ae4d31db04a99673e8163768cc0a2a7062e731d

beb83b869f0509bf8009e90db5c8728e840e782d2cf928dae

35c2578ec55f0d11665a30b37f8636c08789976d8ee9fe9a5

c4a0435f0821738e51d6bdd6e6711a5acb620018658cce93

df37d7e85f9a0104a5845053995ce8

Publickeytokenis2dc940d5439468c2

创建好了公钥/私钥对,创建强命名程序集就很容易了。只需要把System.Reflection.AssemblyKeyFileAttribute特性加入到源代码中就可以了:?[assembly:AssemblyKeyFile("MyCompany.keys")]

说明:公钥/私钥对文件的扩展名可以是任意的(也可以没有),因为编译的时候都是以元数据的格式读取的。

4.
程序集的部署方式
一个程序集有两种部署方式:
a)
私有方式
和应用程序部署在同一目录下的程序集称作私有部署程序集。弱命名程序集只能进行私有部署。

b)
全局方式
全局部署方式将程序集部署在一些CLR已确知的地方,当CLR搜索程序集时,它会知道到这些地方去找。强命名程序集既可以进行私有部署,也可以进行全局部署。

5.如何部署强命名程序集(StrongNameAssembly)和GAC
a)GAC
的概念
如果一个Assembly要被多个应用程序访问,那么他就必须放在一个CLR已确知的目录下,并且CLR在探测到有对该Assembly的引用时,它必须能自动到该目录下寻找这个程序集。这个已确知的目录称作GACGlobalAssemblyCache),就是全局程序集缓存。它一般位于下面的目录下:<SystemDrive>:/Windows/Assembly/GAC
GAC
的作用就是提供给CLR一个已知的确定的目录去寻找引用的程序集。

b)GAC
的内部结构
GAC
是一个特殊的结构化的目录,用WindowsExplorer浏览你会以为它只是一个包含很多程序集的普通目录。其实不是这样的,在命令行下查看,你会发现它实际上包含很多子目录,子目录的名字和程序集的名称是相同的,但它们都不是实际的程序集,实际的程序集位于程序集名对应的目录下。比如进入GCFWK子目录,我们会发现其中又有很多的子目录。机器内每一个安装到GACGCFWK.dllGCFWK中都会有一个子目录。


这里只有一个目录表明只有一个版本的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.exeGAC中注册程序集跟COM注册差不多,但相对更容易:
1
.把程序集添加到GAC中:GACUtil/isample.dll(参数/i是安装的意思)
2
.把程序集移出GACGACUtil/usample.dll(参数/u就移除的意思)
注意:不能将一个弱命名程序集安装到GAC中。
如果你试图把弱命名程序集加入到GAC中,会收到错误信息:
Failureaddingassemblytothecache:Attempttoinstallanassemblywithoutastrongname”
d)
强命名程序集的私有部署

把程序集安装到GAC有几个好处。首先,GAC使得很多程序可以共享程序集,这从整体上减少了使用的物理内存;其次,我们很容易将一个新版的程序集部署到GAC中,并通过一种发布者策略(差不多就是一种重定向方法,比如将原来引用版本为1.0.0.0程序集的程序,通过更改它的配置文件,转而让程序去引用版本为2.0.0.0的程序集)来使用新版本;最后,GAC还提供了对不同版本程序集的并存(side-by-side)管理方式。但是,GAC的安全策略通常只允许管理员更改,同时,向GAC中安装程序集也破坏了.NET框架的简单拷贝部署的许诺。

除了向GAC或者以私有部署方式部署强命名程序集之外,我们还可以将强命名程序集部署在仅为一小部分程序知道的某个任意目录下。配置每一个应用程序的XML配置文件,让它们指向一个公有目录,这样,在运行时,CLR将知道到哪里去找这个强命名程序集。但这样又有可能会引发”DLLHell”的问题,因为没有哪个程序可以控制这个程序集何时被卸载。这在.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进行签名,并在开发机上由开发人员自行取消跳过验证
分享到:
评论

相关推荐

    强命名程序集的逆向方法.doc

    强命名程序集的逆向方法.doc 反向编译程序集 c# ,强命名的作用不大

    .NET的DLL文件强命名后加入程序集缓存

    .NET的DLL文件强命名后加入程序集缓存

    把程序集安装到全局程序集缓存中的步骤

    对类库项目生成强命名,生成密钥文件;(该名称是加密的哈希密钥或签名。这种强名称可确保正确的组件版本控制。这有助于防止具有相同名称的组件相互冲突或被消耗应用程序误用) 使用.net Framework 开发包中bin目录...

    .Net下的签名与混淆图文分析

    即强命名程序集,可以确保你的程序集唯一,而不被篡改、冒用等;即使相同名字的程序集如果签名也会不同。 签名前后程序集结构对比 假设程序集名子叫”WindowsApplication1″,签名前后程序集信息对比 代码如下:...

    保护.net中的dll文件方法(防止破解、反编译dll)

    强签名 强命名程序集,可以确保你的程序集唯一,而不被篡改、冒用等;即使相同名字的程序集如果签名也会不同。强签名很简单 为项目添加强名称方法:1.右键单击项目,打开属性窗口;2.在属性窗口里选择《签名》标签,...

    C#高级编程 .NET体系结构.

    .NET体系结构.... 3 1.1 C#与.NET的关系...... 3 ...1.4 程序集...... 14 1.4.1 私有程序集..... 15 1.4.2 共享程序集..... 16 1.4.3 反射..... 16 1.5 .NET Framework类...... 16 1.6 命名空间....

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    3.4 在生成的程序集中引用一个强命名程序集 3.5 强命名程序集能防范篡改 3.6 延迟签名 3.7 私有部署强命名程序集 3.8 “运行时”如何解析类型引用 3.9 高级管理控制(配置) 3.9.1 发布者策略控制 第4章 类 型...

    CLR.via.C#.(中文第3版)(自制详细书签)

    3.4 在生成的程序集中引用一个强命名程序集 3.5 强命名程序集能防范篡改 3.6 延迟签名 3.7 私有部署强命名程序集 3.8 “运行时”如何解析类型引用 3.9 高级管理控制(配置) 3.9.1 发布者策略控制 第4章 类 型 ...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    3.4 在生成的程序集中引用一个强命名程序集 3.5 强命名程序集能防范篡改 3.6 延迟签名 3.7 私有部署强命名程序集 3.8 “运行时”如何解析类型引用 3.9 高级管理控制(配置) 3.9.1 发布者策略控制 第4章 类 型...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    3.4 在生成的程序集中引用一个强命名程序集 3.5 强命名程序集能防范篡改 3.6 延迟签名 3.7 私有部署强命名程序集 3.8 “运行时”如何解析类型引用 3.9 高级管理控制(配置) 3.9.1 发布者策略控制 第4章 类 型...

    WineApi:包装整个 wine.com RESTful API 对象模型的 AC# 类库。 此外,使用 MVVM 的 WPF 演示客户端

    它依赖于 ,这是一个强命名的程序集。 当前的 WineApi NuGet 包是针对 Newtonsoft.Json 4.0.5 构建的。 但是,4.0.5 已被取代(截至 2012 年 3 月 10 日为 4.0.8)。 这会导致运行时出现问题: Could not load file...

    Visual Basic 2012入门经典(第7版)

    ◆ 演示如何构建类库、使用强命名以及注册程序集 ◆ 讨论如何使用SQL Server和ADO.NET进行数据库编程 ◆ 探讨Web应用程序的基本组件,并研究如何构建网站 ◆ 介绍用于开发Windows 8触摸应用程序的新类型

    .NET程序反编译神器-DotNetHelper_v22_20120617

    4.将 ildasm v2.0 更新为简体中文版本,并且去掉了禁止反编译某些程序集的限制 2007-03-26 更新 1.选择输出类型自动调整输出文件扩展名,感谢 wanfu 2.编译、反编译时显示 DOS 窗口,感谢 wanfu 2007-03-25 更新 1...

Global site tag (gtag.js) - Google Analytics