离职后来到现在这家公司,在这几天接到一个项目要求是要通过淘宝聚石塔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. vuejs小白入门

    后端做不好,是时候学习一下前端了,听说在很流行vue,那么久跟风学习一波. unbuntu下安装npm,然后安装node,这应该算是开发工具或者执行引擎吧. 感觉web前端框架怎么变,都是对html, ...

  2. Round A - Kick Start 2019

    a.链接:https://codingcompetitions.withgoogle.com/kickstart/round/0000000000050e01/00000000000698d6 题意: ...

  3. NFS 系统搭建 - 成功

    NFS是Network File System的缩写,即文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 工作流程 1.由程序在NFS客户端发起存取文件的请求,客户端本地 ...

  4. css与html基础收集

    1.css去掉iPhone.iPad默认按钮样式 nput[type="button"], input[type="submit"], input[type=& ...

  5. error: can't copy 'docx\templates\default-docx-template': doesn't exist or not a regular file --------------- Failed building wheel for python-docx; python-docx的安装使用;python操作word

    本人第一安装python-docx很不幸就出现了,如下的错误:(如果你也遇到同样的错误,不要慌可以参考下面解决方案,由于第一次处理这种错误,如有不对欢迎大家多多批评指正) 问题所在是因为我们的setu ...

  6. ueditorUE 去掉本地保存成功的提示框!

    网上修改什么JS的太麻烦,这样比较暴力,仅供参考 这里直接修改的样式: ue.ready(function () {                 $(".edui-editor-mess ...

  7. Hibernate4集成spring4报错----No Session found for current thread

    在编写一个Hibernate4集成spring4的小demo的时候出现了该错误: org.hibernate.HibernateException: No Session found for curr ...

  8. 在vue中使用svg sprite

    概述 这几天研究了一下在vue中使用svg sprite,有些心得,记录下来,供以后开发时参考,相信对其它人也有用. 在vue中导入svg 在vue中导入svg的方法有很多种,比如在img标签的src ...

  9. [Swift]LeetCode637. 二叉树的层平均值 | Average of Levels in Binary Tree

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  10. linux各个服务器的软件自启动

    首先你需要编写一个shell脚本,也就是启动app的,当然还应该有stop的脚本 这里贴出我的,因为每个人的服务安装路劲不同,故启动不同,仅供参考.如有雷同,纯属你智障 web服务器: 应用服务器: ...