System.IO.FileLoadException: 需要强名称程序集。 (异常来自 HRESULT:0x80131044)
这个问题,可能是需要进行程序集签名。
我的发生场景是在使用Shell的时候,我的Shell功能,会使用到其它的程序集,而其它的程序集又会使用到更多其它的程序集。其中有些程序集还是Nuget中引用安装的。
我只能控制我自己开发的程序集对它进行签名,而无法控制Nuget包引用的程序集让它们签名。
好吧,下面关于如何进行程序集签名,说下解决方案:
第一步:右键打开你的项目属性
第二不:切换到签名
第三步:新建一个签名。你会看到我已经有了1个签名,为了演示,你忽略我这个已经建立好的签名即可。
第四步:创建你的签名即可。密码自己想要就写,不是必须的。
下面说下,你没有源码的Nuget包,要怎么加上程序集签名:
以EpPlus.dll为例,这是一个从Nuget服务器上下载的无源码的dll,它的功能是用于处理Excel的。做过Excel的同学,估计对此dll应该熟悉。
第一步,使用Everything这个软件查找ildasm.exe的目录
当然,你可能没有Everything这个软件,不过这是你的事情。没有软件的话,你就只能自己手动去搜索了。
第二步,根据您的dll性质,选择相应的ildasm工具进行反汇编。
特别提醒,你是.net core的dll或者是.net framework的dll,使用的ildasm工具是不同的。别看上面搜索出来的ildasm.exe文件名一样,实际是有区别的。
第三步,打开你的cmd命令提示窗口,cd导航到指定的idlasm路径,运行以下代码
将出现以下界面:
第四步,反汇编后,会得到以下的东西,我是放在了E:盘,所以E盘下将会生成下图的东西
第五步,使用文章开头的方式,生成一个签名文件Key.snk,如果不会,请回到文章开头去看。
然后我把Key.snk拷入E盘,跟反汇编生成的文件放在一起。
第六步,使用Everything工具,查找ilasm.exe工具,该工具用于正汇编,意思就是将刚才反汇编出来的文件再次正向汇编。
请您注意,一个是ildasm.exe工具,一个是ilasm.exe工具,中间相差一个字母d,是有区别的。
第七步,进入你的cmd命令提示行,cd到指定的ilasm.exe工具下,键入正向汇编命令
第八步,执行该指令,得到下图结果
于是在我的E盘生成了一个叫epplus1.dll的文件,为什么叫epplus1.dll?因为我的命令中指定了它的名字就叫这个。
于是我的E盘多了一个,如下图所示。然后你就可以用这个签名后的dll去干活了。
以上步骤中,会出现ilasm无法正向汇编的情况,原因是在使用ildasm进行反汇编的时候,你使用错了工具,.net core和.net framework,以及x86、x64使用的反汇编工具是不一样的,别看那里有很多的ildasm工具,虽然名字一样,但每个工具实际是不一样的。当发生这种错误的时候,你反汇编多试几次就可以找到正确的反汇编和正汇编工具了。
最后为了给您方便,特意提供命令如下,供您拷贝:
ildasm E:\EPPlus.dll /output=E:\EpPlus.il
ilasm E:\EpPlus.il /dll /output=E:\epplus1.dll /Key=E:\Key.snk /Resource=E:\EpPlus.res
祝您用餐愉快。