C# 如何解决 引用的两个同名同版本的DLL冲突
离职后来到现在这家公司,在这几天接到一个项目要求是要通过淘宝聚石塔API来抓取公司的订单流水。按理说这项任务不算很难,但是,你也知道,壮士出征往往死在离出发地不远的地方。现在我们来研究一下为什么会导致这种原因,以及我们该如何去解决掉这个问题。
一:DLL冲突的特殊性
本次遇到的问题很是棘手,因为在老项目中已经存在阿里巴巴速卖通的API—TopSdk,然后现在要去完成另外一块的内容,也就是说需要我去下载淘宝聚石塔的sdk,悲剧的是,下载下来的sdk还是叫做TopSdk,不仅如此,这两个sdk虽然同名,但是他们的版本号,命名空间,名称都是一模一样的,最要命的是,他们并没有用于区别DLL的publicKeyToken都是空的!!!我在想,阿里巴巴写的DLL肯定是很严谨的啊,但是偏偏就是被我遇上了这种不向后兼容的特殊情况,简直是欲哭无泪,后来询问了老员工,他们也表示未曾见过这样的特殊情况。于是,我就硬着头皮开启了我的探索之路,也希望可以帮助那些遇到同样问题的人。
问题总结:一旦在项目中使用两个同名同版本号同命名空间的DLL的时候,有一个DLL无法添加,即使改名称能够添加了,本质上文件名还还一样,都是TopSdk。而且,如果不修改名字会直接覆盖原先的项目,这样会导致项目出现更多的Bug。
二:如何解决这样的冲突问题
在知道了问题的产生后,我们又必须使用这两个DLL,那么我们就可以通过vs这款强大的IDE里面自带的插件,来进行强命名。强命名就是为了生成一个用来防止冲突的 publicKeyToken。接下来我们来看看具体的操作。
1:首先在电脑(本人使用的是win10系统)打开vs2015文件夹,可以看到红线框内的开发者命令提示,右键选择以管理员的方式打开。
2:打开页面后,先生成一个KeyFile 。命令是:
sn -k keyPair.snk

3:在生成一个keyFile之后,就要去解析得到DLL文件的中间语言文件(MSIL)
ildasm C:\Users\nsysdf\Desktop\twoDll\JushitaTopSdk.dll /out:C:\Users\nsysdf\Desktop\twoDll\JushitaTopSdk.il
其中,C:\Users\nsysdf\Desktop\twoDll\JushitaTopSdk.dll 是你想要强命名的DLL文件所在地址。最后得到的JushitaTopSdk.il就是中间语言文件
4:这一步是最关键的一步:使用导出的MSIL(JushitaTopSdk.il) 和刚创建的KeyFile 生成一个新的的DLL 文件。
指令如下:
ilasm C:\Users\nsysdf\Desktop\twoDll\JushitaTopSdk.il /dll /key:keyPair.snk
然后系统就会开始生成
注意:如果不是用管理员的方式打开,到这步就可能导致合成失败

最后,我们得到了一个带有签名的DLL了,把它引入项目后,与同名的DLL已经完美兼容了。
以上就是今天分享的全部内容,希望可以帮助到同样踩坑的小伙伴们。

C# 如何解决 引用的两个同名同版本的DLL冲突的更多相关文章
- 解决一个项目里面加载两个同名不同版本的DLL的问题
在config里面这样配置,可以加载不同版本的dll <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com ...
- 同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL
问题描述 我们最近在使用Redis作Session的集中化,中间碰到了一个如下问题:我们有一些项目比较老,引用了NewtonJson的4.0.3.0版本的DLL,但是Redis提供的C#集成DLL引用 ...
- 完美解决IE8有两个进程的问题
完美解决IE8有两个进程的问题,照以下方法设置后就只有一个进程了,没有什么负影响哦! 方法: 1.win+R,在运行框里输入:gpedit.msc,回车进入组策略设置. 2.依次展开:计算机配置——管 ...
- POJ2676,HDU4069解决数独的两种实现:DFS、DLX
搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子:另一种是考虑处理某一行(列.宫)时,对于某一个没用过的数字,若该行(列.宫)只有一个可 ...
- 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)
分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...
- 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...
- .Net中DLL冲突解决(真假美猴王)
<西游记>中真假美猴王让人着实难以区分,但是我们熟知了其中的细节也不难把他们剥去表象分别出来.对问题不太关心的可以直接调到文中关于.Net文件版本的介绍 问题 最近在编译AKKA.net ...
- Maven排除项目中同名不同版本的jar
今天突然发现web项目打包后的exe居然有200M+了,心想不应该有这么大的啊,于是检查了一番发现引用的jar有130+个,仔细一瞅发现好多同名的但是不同版本的jar,比如说有commons-http ...
- 【重构】C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用)
原文:[重构]C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CocoWu892 ...
随机推荐
- Golang实现requests库
Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...
- python爬虫第六天
今天继续学习一些实战爬虫 链接爬虫实战 要求:把一个网页里所有的链接地址提取出来 思路:(1)确定爬取的入口链接 (2)构建提取链接的正则表 ...
- 面试题5-[剑指offer] 二维数组中的查找
题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- Live2D插件--漂浮的二次元小姐姐
这个插件找了很久,都没找到,今天偶然翻到一个小哥的博客发现了这个,果断偷走. 教程转自简书:https://www.jianshu.com/p/1cedcf183633 还有这些,你可能有用 修改位置 ...
- Linux下CenOS系统 安装Redis
1.redis下载 进入root目录:cd /root(目录可自定义) wget http://download.redis.io/releases/redis-3.2.10.tar.gz 红色部 ...
- 从协议入手,剖析OAuth2.0(译 RFC 6749)
1.介绍 https://tools.ietf.org/html/rfc6749 传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资 ...
- 【RL-TCPnet网络教程】第25章 DHCP动态主机配置协议基础知识
第25章 DHCP动态主机配置协议基础知识 本章节为大家讲解DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),通过前面章节对TCP和UDP ...
- App功能测试
App功能测试 1. 运行 1)App安装完成后的试运行,可正常打开软件. 2)App打开测试,是否有加载状态进度提示. 3)App页面间的切换是否流畅,逻辑是否正确. 4)注册 同表单编辑页面 用 ...
- 分布式服务框架介绍:最成熟的开源NIO框架Netty
尽管JDK提供了丰富的NIO类库,网上也有很多NIO学习例程,但是直接使用Java NIO类库想要开发出稳定可靠的通信框架却并非易事,原因如下: 1)NIO的类库和API繁杂,使用麻烦,你需要熟练掌握 ...
- FFmpeg 结构体学习(一): AVFormatContext 分析
在 FFmpeg 学习(六):FFmpeg 核心模块 libavformat 与 libavcodec 分析 中,我们分析了FFmpeg中最重要的两个模块以及重要的结构体之间的关系. 后面的文章,我们 ...
