未能加载文件或程序集“xxx”或它的某一个依赖项。强名称验证失败

    当我们从互联网上下载一个程序集供本地调用的时候,如何保证这个程序集是未经第三方恶意篡改过的呢?如果两个程序集的名称、大小、版本号都相同是不是就意味着这两个程序集文件就相同了呢?在.NET平台下区分程序集采用的方法是使用名称,但是名称有强弱之分。

    强名称在弱名称的基础上添加了数字签名,并且强名称签名的程序集不能引用未被签名的程序集

    强名称的作用主要有三个:一是区分不同的程序集;二是确保代码没有被篡改过;三是在.NET中,只有强名称签名的程序集才能放到全局程序集缓存中。

一、问题背景

在使用 vs 开发过程中,.Net程序集的dll与exe使用了签名(仅延时签名

这里写图片描述

并且为了开发方便,执行了忽略强名称验证的命令(xxx 为签名的程序集名称):

sn.exe -Vr xxx

但是执行代码调试时,仍然出现了错误(publicKey为: e982c879116440581,根据实际情况会不同):

这里写图片描述

二、解决方法

    实际上为了开发方便,执行禁用.Net程序集强名称验证的操作(sn.exe -Vr xxx),会在注册表中添加对应的注册项,具体位置如下:

  • x86:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\
  • x64:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification\]
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\StrongName\Verification\]

    查看实际的位置时,发现Wow6432Node注册项下确实有(我的是x64位系统):
这里写图片描述

    但根本就没有HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\StrongName\Verification 这个注册项,而我的应用程序是x64的,需要使用该注册项来验证.Net程序集的强命名。

    所以采用手动建立该注册项,并添加响应的注册项到该目录下。为了简单,直接建立了*,e982c879116440581 注册项。(如果添加 “*”,将禁用所有的.Net程序集强名称验证)
这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郎涯技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值