离职后来到现在这家公司,在这几天接到一个项目要求是要通过淘宝聚石塔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冲突的更多相关文章

  1. 解决一个项目里面加载两个同名不同版本的DLL的问题

    在config里面这样配置,可以加载不同版本的dll <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com ...

  2. 同一个解决方案或有依赖关系的两个项目引用同名但不同版本的DLL

    问题描述 我们最近在使用Redis作Session的集中化,中间碰到了一个如下问题:我们有一些项目比较老,引用了NewtonJson的4.0.3.0版本的DLL,但是Redis提供的C#集成DLL引用 ...

  3. 完美解决IE8有两个进程的问题

    完美解决IE8有两个进程的问题,照以下方法设置后就只有一个进程了,没有什么负影响哦! 方法: 1.win+R,在运行框里输入:gpedit.msc,回车进入组策略设置. 2.依次展开:计算机配置——管 ...

  4. POJ2676,HDU4069解决数独的两种实现:DFS、DLX

    搜索实现:解决数独有两种思考策略,一种是枚举当前格能填的数字的种数,这里有一优化策略就是先搜索能填入种数小的格子:另一种是考虑处理某一行(列.宫)时,对于某一个没用过的数字,若该行(列.宫)只有一个可 ...

  5. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  6. 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题

    原文:解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr.es.ja等问题 通过以下方式对 System.Windows.Interactivity程序集添 ...

  7. .Net中DLL冲突解决(真假美猴王)

    <西游记>中真假美猴王让人着实难以区分,但是我们熟知了其中的细节也不难把他们剥去表象分别出来.对问题不太关心的可以直接调到文中关于.Net文件版本的介绍 问题 最近在编译AKKA.net ...

  8. Maven排除项目中同名不同版本的jar

    今天突然发现web项目打包后的exe居然有200M+了,心想不应该有这么大的啊,于是检查了一番发现引用的jar有130+个,仔细一瞅发现好多同名的但是不同版本的jar,比如说有commons-http ...

  9. 【重构】C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用)

    原文:[重构]C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CocoWu892 ...

随机推荐

  1. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)

    实验十四  Swing图形界面组件 理论部分: 不使用布局管理器 有时候可能不想使用任何布局管理器,而只 是想把组件放在一个固定的位置上.下面是将一 个组件定位到某个绝对定位的步骤: 1)将布局管理器 ...

  2. 在浏览器输入URL时发生了什么

    浏览器器检查cache,如果请求对象已经缓存并且是最新的,执行第9步. 浏览器询问操作系统,请求服务器的IP地址 操作系统进行DNS查找,然后告诉浏览器服务器的IP 浏览器和服务器简历一个TCP连接( ...

  3. js 面向对象的三大特性:封装,继承、多态

    一:什么是封装? 封装的定义:就是对象内部的变化对外界是透明的,不可见的. 封装的场景: 在写项目的过程中,有时候不同页面,会有相同的功能,我们还需要每个页面都写一遍吗?额,,,,其实也可以写的,只不 ...

  4. MySql操作(一)

    1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...

  5. [Swift]LeetCode266.回文全排列 $ Palindrome Permutation

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  6. SpringBoot环境搭建

    创建 maven 项目 , 选择的打包类型为 jar 类型 自己构建 SpringBoot 项目时 , 要继承 SpringBoot 的父项目 , 这里用的版本是 2.1.4 点击 Finish , ...

  7. Java-SSM框架页面时间格式转换

    在JSP中,列表查询绑定时间时,会出现以下的时间格式,那样看起来的话,感觉... 那如何转换成“yyyy-MM-dd HH:mm:ss”格式呢?--很简单,在JSP头顶加上 <%@ taglib ...

  8. 巡风源码阅读与分析---AddPlugin()方法

    文件位置:view/view.py AddPlugin() # 新增插件异步 @app.route('/addplugin', methods=['get', 'post']) @logincheck ...

  9. 基于ipv6的数据抓包

    一.实验拓扑 二.配置过程 以r1为例 R1: R1(config)#int f0/0 R1(config-if)#ipv6 enable R1(config-if)#ipv6 address 200 ...

  10. LongAdder 测试

    import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.util.concurrent.CountDownLatch;i ...