当前位置:主页 > 软件编程 > .NET代码 >

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

时间:2022-07-04 14:05:40 | 栏目:.NET代码 | 点击:

一、什么是强名称

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

由于程序集清单包含构成程序集实现的所有文件的文件散列,因此只对程序集中包含程序集清单的一个文件生成数字签名就足够了。强名称相同的程序集应该是相同的。

为什么要使用强名称签名

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

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

二、如何设置强名称

上面我们讲了什么是强签名,以及强签名的好处,下面我们来看看如何给应用程序设置强名称。

1、应用程序有源代码

打开vs tool command,如下图所示:

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含有嵌入的resource,则会有Dapper.res文件产生,并有相应的嵌入资源文件产生。

ildasm Dapper.dll /out=Dapper.il

如下图所示:

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

使用下面的命令重新编译Dapper.dll,然后会附带强命名参数

ilasm Dapper.il /dll /resource=Dapper.res /key=Dapper.snk /optimize

如下图所示:

这样就表示编译成功了。

5、验证签名信息

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

sn -v Dapper.dll

如下图所示:

这就表示重新编译后的dll文件有了强名称。

6、重新引用

编译成功以后,会在目录下面生成这么几个文件:

可以看到:Dapper.dll这个文件是最新生成的,我们在项目里面重新引用上面新编译的Dapper.dll文件,然后重新编译项目:

可以看到,这时就不会报Dapper.dll没有强名称的错误了。其它没有强名称的dll文件也使用同样的方式进行处理。

您可能感兴趣的文章:

相关文章