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 ...
随机推荐
- Android进阶推荐书籍
中级进阶推荐看一下以下这几本书 1.<Android从入门到精通(附光盘)> 明日科技 编 2.<第一行代码2 Android(第二版)> 郭霖 著 3.<Android ...
- js根据顺序加载,有依赖关系
function loadScript(url, callback) { var script = document.createElement("script"); script ...
- C语言复习1_变量与数据类型
变量命名规则: 1.变量名的首字母或下划线(不能是其他特殊符号) 2.变量名的其他字母包含下划线.数字 和字母 3.不能使用关键字 基本数据类型 分为数值型和非数值型,其中数值型分为整型和非整型 整型 ...
- 查询结果集转换成HTML存储过程
工作中经常需要用SQLServer发送报警或者业务报表邮件,每次现拼串也不是办法,故写了一个TableResult to HTML的存储过程 USE master; GO -- Description ...
- 【二代示波器教程】第15章 FreeRTOS操作系统版本二代示波器实现
第15章 FreeRTOS操作系统版本二代示波器实现 本章教程为大家讲解FreeRTOS操作系统版本的二代示波器实现.主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任务 ...
- HTTP协议概念与特点,HTTP的状态码,HTTPS是什么?
很多人在打开网页的时候,在浏览器地址栏里都会看到http ,在Java WEB里,HTTP也是个重点内容,今天我们就来详细了解和学习HTTP . HTTP是Hyper Text Transfer P ...
- Android OpenSL ES 开发:使用 OpenSL 播放 PCM 数据
OpenSL ES 是基于NDK也就是c语言的底层开发音频的公开API,通过使用它能够做到标准化, 高性能,低响应时间的音频功能实现方法. 这次是使用OpenSL ES来做一个音乐播放器,它能够播放m ...
- [Swift]LeetCode82. 删除排序链表中的重复元素 II | Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- MySql和Oracle数据库区别
Oracle与mysql区别: 1.Oracle有表空间,mysql没有表空间. 2.mysql的char类型取值范围0-255字节,varchar为0-65535字节 3.oracle的char类型 ...
- Django+Bootstrap+Mysql 搭建个人博客(二)
2.1.博客首页设计 (1)settings.py MEDIA_ROOT = os.path.join(BASE_DIR,'media').replace("//","/ ...
