Net dll版本兼容问题
Net dll组件版本兼容问题
https://www.cnblogs.com/newP/p/9543528.html
dll组件版本兼容问题,是生产开发中经常遇到的问题,常见组件兼容问题如:Newtonsoft.Json,log4net等
为了节约大家时间,想直接看解决方法的,可直接点击目录3、4
目录
1.版本兼容问题的原因
2.解决版本兼容前提
3.指定特定版本bindingRedirect**
4.指定某文件夹中的特定版本codeBase**
版本兼容问题的原因
首先让我们简单了解下程序引用的原理:
当运行库试图解析对另一个程序集的引用时,就开始进行定位并绑定到程序集的进程。详细见:运行库如何定位程序集
步骤如下:
第 1 步:检查配置文件(.config文件)
第 2 步:检查以前引用的程序集
第 3 步:检查全局程序集缓存
第 4 步:通过基本代码或探测定位程序集
解决版本兼容前提
简单了解原理以后,常见解决兼容的方法
- 首先了解你要用那个dll,具体版本是什么,查看版本方法:
1)文件夹里dll文件,右键->属性 
2)解决方案里引用的dll,右键->属性
方法1、指定特定版本**
利用config的bindingRedirect指向特定版本组件
.config添加节点
复制代码
复制代码
解释:
项目中所有项目、类库引用0~10的Newtonsoft.Json版本,最终都指向到10这个版本
经验:
1、各版本之间是有代码变化的,如果一个类库用了某个组件10.0的A10方法,结果指向的8.0,8.0很有可能还没有A10这个方法,自然项目中用到A10的地方会报错。调试和查错误比较麻烦,编译器会根据bin下面的dll版本与代码来匹配调用方法和属性提示错误,或者不提示错误。
2、代码可控的地方,尽可能的将版本更新中的废弃方法改成高版本的替代方法。
3、一般高版本多数是兼容低版本的方法,指向高版本报错几率小些,当然也有特殊情况。
方法2、指定某文件夹中的特定版本
方法一能解决很多项目中出现的版本问题,但是有时候还是会遇到比较奇怪的兼容问题。
例如:log4net和Memcached.ClientLibrary中的log4net冲突的问题,本文以解决这一版本冲突问题为例介绍此方法的使用方法。
如果想直接看结果,请点击解决方法
为啥会出现log4net版本兼容问题呢?
常见的组件是以name(名称)、version(版本)、publicKeyToken(公钥)三个组成,原因主要是由于log4net version 1.2.11与1.2.10的publicKeyToken不同所致。
可利用VS工具SN -T 组件文件名.dll查看公钥。
log4net (≥ 1.2.11) 公钥标记为 669e0ddf0bb1aa2a
log4net (= 1.2.10) 公钥标记为 1b44e1d426115821
看log4net在发展过程中改过一次身份证,又有好多老版本的组件引用了log4net的低版本导致与高版本兼容问题
log4net版本兼容问题的样例
1、创建项目,引用Memcached组件
WebApp为项目应用层,ClassLibrary为工具类库,WebApp引用ClassLibrary项目,ClassLibrary通过nuget引入Memcached.ClientLibrary 1.0组件。
ClassLibrary创建类Testing.cs代码如下:
复制代码
public class Testing
{
public static void Init()
{
MemcachedClient mc = new MemcachedClient();
}
}
复制代码
WebApp创建测试页面,测试代码如下:
Testing.Init();
2、应用层,引用高版本log4net
WebApp引用log4net 2.0.8
最终项目情况是:
3、运行结果
查看WebApp的bin文件夹下面的log4net版本是2.0.8,而Memcached.ClientLibrary组件用的log4net是1.2.10.0版本,所以报错了。
注意
如果单独编译WebApp,bin下面是版本是2.8.0,如果单独编译ClassLibrary类库,bin下面版本是1.2.10.0
处理log4net版本兼容问题
1、bin下面添加log4net1.2.10.0文件夹,并将log4net.dll版本为1.2.10.0放入到文件夹中,可重命名为log4net1.2.10.0.dll。
2、config添加
复制代码
复制代码
3、结果如下
经验:
1、文件需要放在bin下面,并单独建立个文件夹,注意:若不建立文件夹,直接将重命名的log4net1.2.10.0.dll扔到bin下会报错,应该是探测方法是根据name寻找的。
2、ClassLibrary类库在单独编译的时候,会将高版本的替换成低版本,会有可能报错,可以在开发中将其生成的dll不复制到bin下,设置是在引用的dll下右键,复制本地设置为false,操作如下:
3、为了能把log4net1.2.10.0.dll上传到gitlab上面,可以在WebApp建立个相应文件夹,并设置复制到输出目录-始终复制,vs编译时会自动将log4net1.2.10.0/log4net1.2.10.0.dll复制到bin下面
总结
希望通过此文章,帮助更多的人解决NET组件的版本兼容问题。
参考文章
https://www.cnblogs.com/shijun/p/3713830.html
https://blog.csdn.net/zfrong/article/details/6183353
https://docs.microsoft.com/zh-cn/previous-versions/dotnet/netframework-3.5/6bs4szyc(v%3dvs.90)
https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2008/yx7xezcf(v=vs.90)
Net dll版本兼容问题的更多相关文章
- dll版本兼容
		
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <depen ...
 - Net dll组件版本兼容问题
		
dll组件版本兼容问题,是生产开发中经常遇到的问题,常见组件兼容问题如:Newtonsoft.Json,log4net等 为了节约大家时间,想直接看解决方法的,可直接点击目录3.4 目录 1.版本兼容 ...
 - 使用Common.Logging与log4net的组件版本兼容问题
		
引用: http://www.cnblogs.com/shijun/p/3713830.html 近期使用了Common.Logging的ILog接口做日志接口,同时利用其log4net适配器与lo ...
 - oracle版本兼容问题
		
问题一描述:本机环境升级为vs2012升级TLS程序为framework4.0,本机ODAC为ODTwithODAC112030.本机为oracle10g本机程序生成成功,运行成功. 发布到服务器后, ...
 - The version of SOS does not match the version of CLR you are debugging;  SOS.dll版本不匹配; Dump文件不同环境mscordacwks.dll版本问题
		
The version of SOS does not match the version of CLR you are debugging 和 PDB symbol for clr.dll not ...
 - Microsoft ReportViewer 控件类型版本兼容问题及解决方法
		
错误 Parser Error Message: The base class includes the field 'rvEquipment', but its type (Microsoft.Re ...
 - 模块XXXX可能与您正在运行的Windows版本不兼容。检查该模块是否与regsvr32.exe的x86(32位)x64(64位)版本兼容。
		
最近自己在编写ActiveX控件.遇到的麻烦事不少. 今天遇到了这个问题“模块XXXX可能与您正在运行的Windows版本不兼容.检查该模块是否与regsvr32.exe的x86(32位)x64(64 ...
 - 解决Linux动态库版本兼容问题
		
说道“动态库版本兼容”,很多人头脑中首先蹦出的就是“Dll Hell”.啊,这曾经让人头疼的难题.时至今日,这个难题已经很好地解决了. 在进一步讨论之前来思考一个问题:Linux下为什么没有让人头痛的 ...
 - dll版本冲突的解决方法
		
问题描述 当运行站点或者控制台等程序时,如果项目引用的dll版本与其它dll所依赖的dll版本不一致,就会报未能加载程序集的错误.错误信息为: 未能加载文件或程序集"Newtonsoft.J ...
 
随机推荐
- LOJ#2131. 「NOI2015」寿司晚宴
			
$n \leq 500$,$2-n$这些数字,两个人挑,可以重复挑,问有几种方案中,一个人选的所有数字与另一个人选的所有数字都互质. 不像前两题那么抠脚.. 如果$n$比较小的话,可以把两个人选的数字 ...
 - 怎样在SQL2005中设置 自增长类型?
			
原文发布时间为:2009-04-25 -- 来源于本人的百度文章 [由搬家工具导入] 最近好几个人问我。。。。。 企业管理器-->右键你的表-->设计表-->选中一int类型字段-- ...
 - VS2008 没办法太强大了
			
原文发布时间为:2009-06-13 -- 来源于本人的百度文章 [由搬家工具导入] VS2008 太强大了。。。继续学习。。。。现在微软的某些强大功能也是针对 VS2008了。。。所以。。必须得装上 ...
 - Maven 集成Tomcat7插件自动部署
			
1.配置tomcat-users.xml文件 在tomcat安装目录下找到tomcat-users.xml文件.该文件路径为[tomcat安装根目录]/conf/ 修改文件内容,增加下列内容:(一般配 ...
 - no update
			
cd /home/.gnupg/ mv gpg.conf gpgbake.conf pacman -S archlinux-keyring && pacman -Syu 如果还是不行, ...
 - 三个div向左浮动不在同一行,向右浮动在同一行的解决办法
			
前几天在写代码的时候发现了一个问题,问题的大致描述如下: 在一个大的div中,同一行有三个小的div,当三个小的div均向左浮动时,会出现换行问题,均向右浮动时却在同一行. 解决这个问题的方法是在:在 ...
 - hdu 4991(树状数组+DP)
			
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
 - 【转载】Word2010编号列表&多级列表
			
1.引用场景 对于一份标准.漂亮的word文档,编号列表和多级列表的设置时必不可少的,正因为有它们,文档看起来才更专业,使用起来才更加的方便.如下面截图一般,这是十分常见的多级列表设置 ...
 - 自做CA自签发SSL证书
			
一.把证书准备好.步骤与使用OpenSSL自签发服务器https证书所述大同小异.在这里再重复一次.1.制作CA证书:ca.key CA私钥: openssl genrsa -des3 -out ca ...
 - Ansible进阶之企业级应用
			
1.环境 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 ...