如何为没有源码的DLL文件添加强名称

如何为没有源码的DLL文件添加强名称,第1张

为没有源码的DLL文件添加强名称如果项目中引用了其他没有源码的dll文件,并且此dll文件是没有强名称的程序集,则编译时会出现类似 "Assembly generation failed -- 引用的程序集 'xxxxxxxxxxx' 没有强名称" 这样的错误。

我这里引用的是Interop.Scripting.dll程序集,它不是强名称的,则需要进行以下 *** 作:

1.打开SDK 命令提示窗口

2.创建一个新的随机密钥对:

sn -k Interop.Scripting.snk

3.反编译目标程序集

ildasm Interop.Scripting.dll /out=Interop.Scripting.il

3.重新编译,附带强命名参数

ilasm Interop.Scripting.il /dll /resource=Interop.Scripting.res /key=Interop.Scripting.snk /optimize

4.验证签名信息

sn -v Interop.Scripting.dll

OK,将生成的dll文件重新引入到项目中然后编译。

那么什么叫强命名程序集呢?我们知道,以前在Windows下开发程序时常会遭遇著名的“DLL Hell”问题,即动态链接库的向后兼容问题。微软在.Net产生前曾尝试使用COM组件的方式来解决DLL Hell问题,即使用Guid来唯一的标识每一个COM组件。但是,实际上使用COM组件(包括版本升级)也是一件颇为麻烦的事:为了运行COM组件就必须在组册表中对其进行注册,重新编译有可能破坏Guid从而导致原来引用此COM组件的程序不能正确运行,等等。

在.Net中,微软引入了一种新的解决方案:强命名程序集(Strong Name),以及与之配套的全局程序集缓存(GAC)来解决这个问题。

我们知道,.Net使用Name、Version、Culture、PublicToken四个属性来唯一标识一个程序集,而不同产品前三个属性(Name、Version和Culture)完全相同的情况是有可能发生的,如此一来,这唯一标识程序集可重任就落到PublicToken的头上了。强命名的程序集正是使用RSA来保证PublicToken的唯一性,因为在理论上,非对称算法RSA生成的公钥/私钥对不会重复。.Net正是通过在编译项目时将指定的公钥/私钥对写入程序集来保证其唯一性。

对于全局程序集缓存(GAC),MSDN是这样介绍的:安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。

在开发一般的、非共享的程序时,我们不需要使用强命名的程序集,仅将项目(Project)编辑成.DLL或者.EXE即可。但是,如果我们开发的是组件库、框架时,通过对程序集进行强命名,并使用将其部署到GAC中,可以保证我们的程序集不会出现版本问题。

使用命令行工具

SDK Command Prompt,键入:SN -T C:\*****.dll

就会显示出该dll具体的

PublicKeyToken数值。

如果该程序集没有强命名,则不会有

PublicKeyToken数值。

将一个程序集强命名的方法是:

用SN -k C:\***.snk命令生成***.snk文件,将该snk文件加载到项目中。在项目上右键属性,选择Signing选项卡,钩选中“Sign the assembly”,再在下拉列表中选择刚才生成的***.snk,重新编译程序集。

此后,该程序集就被强命名了,它的

PublicKeyToken

就有相应数值了。

02注意要用大写的-T,不能用小写的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7786064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存