,,.Net解决引用程序集没有强名称报错

,,.Net解决引用程序集没有强名称报错

本文介绍了。Net来解决引用的程序集没有强名称的问题,对大家的学习或者工作都有一定的参考价值。让我们和边肖一起学习。

:

目录

1.什么是强名称,为什么要用强名称签名?2.如何设置强名称?1.应用有源代码?2.设置签名公钥?2.应用没有源代码?1.打开SDK命令提示符窗口?2.创建新的随机密钥对?3.反编译目标程序集?4.用强命名参数重新编译?5.验证签名信息?6.重新引用。

一、什么是强名称

强名称是由程序集的标识组成的名称,并由公钥和数字签名(为程序集生成)增强,其中标识包括程序集的简单文本名称、版本号和区域性信息。

因为程序集清单包含组成程序集实现的所有文件的文件哈希,所以只为包含程序集清单的程序集中的一个文件生成数字签名就足够了。具有相同强名称的程序集应该是相同的。

为什么要使用强名称签名

通过使用强名称发布程序集,可以确保名称的全局唯一性。强名称还特别满足以下要求:

强名称依靠唯一的密钥对来确保名称的唯一性。没有人会生成与您相同的程序集名称,因为用一个私钥生成的程序集名称与用其他私钥生成的不同。强名称保护程序集版本沿袭。强名称确保没有人能够生成程序集的后续版本。用户可以确保他们加载的程序集版本来自创建它的同一发行者。强名称提供可靠的完整性检查。通过安全检查后。NET framework,您可以确保程序集的内容自生成以来没有被更改过。但是,请注意,强名称或强名称本身并不隐含某种程度的信任,例如数字签名和支持证书提供的信任。您应该能够从引用具有强名称(如版本控制和命名保护)的程序集中受益。如果这个具有强名称的程序集将来引用具有简单名称的程序集,您将失去使用具有强名称的程序集的好处,并且仍然会生成DLL冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。

注意:强命名的应用程序只能引用强命名的dll,不能引用弱命名的dll,但是弱命名的dll可以引用强命名的dll。

二、如何设置强名称

我们在上面讨论了什么是强签名及其好处。让我们看看如何为应用程序设置强名称。

1、应用程序有源代码

打开vs工具命令,如下图所示:

1、生成公钥

然后输入要设置具有强名称的dll文件的路径,并使用以下命令生成签名公钥:

sn -k StrongName.snk

如下图所示:

2、设置签名公钥

将公钥添加到项目中,设置项目属性,并设置签名公钥:

最后,重建项目。

2、应用程序没有源代码

如果在项目中引用了其他第三方的dll文件,并且还没有源代码,而这个dll文件是一个没有强名称的程序集,那么编译时会出现类似“程序集生成失败——引用的程序集XXX没有强名称”这样的消息。

比如我在程序里用了Dapper,但是Dapper没有强名称,所以生成的时候报错了,如下图所示:

此时,我们需要将Dapper转换为强名称程序集。

1、打开SDK命令提示窗口

这里我们以VS 2012为例打开SDK命令提示窗口,如下图所示:

然后,您需要输入Dapper.dll文件所在的目录:

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

使用以下命令生成随机密钥对。

sn -k Dapper.snk

如下图所示:

3、反编译目标程序集

使用下面的命令反编译目标程序集,反汇编dll,生成Dapper.il如果dll包含嵌入资源,会生成Dapper.res文件,并生成相应的嵌入资源文件。

伊尔达斯姆Dapper.dll/out=dapper . il

如下图所示:

4、重新编译,附带强命名参数

使用以下命令重新编译Dapper.dll,后跟强名称参数。

ilasm dapper . il/dll/resource=dapper . RES/key=dapper . snk/optimize

如下图所示:

这意味着编译成功。

5、验证签名信息

成功编译后,我们使用下面的命令来验证重新编译的dll文件是否具有强名称。

锡-钒Dapper.dll

如下图所示:

这意味着重新编译的dll文件有一个强名称。

6、重新引用

编译成功后,目录下会生成几个文件:

正如你所看到的,Dapper.dll的这个文件是新生成的。我们在项目中重新引用新编译的Dapper.dll文件,然后重新编译项目:

正如你所看到的,在这个时候,你不会报告Dapper.dll没有强有力的名字。其他没有强名称的dll文件也以同样的方式处理。

这就是这篇文章的内容。Net解决了引用的程序集没有强名称的问题。希望对大家的学习有帮助,也希望大家多多支持。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: