问题是这这样的,我的项目中需要引用两个第三方框架(Quartz和Couchbase.NetClient),而这两个框架的程序集都同时依赖于一个日志框架(Common.Logging),其中Quartz依赖的是3.0.0.0版本,而Couchbase.NetClient依赖的是2.0.0.0版本,现在问题来了:
这个错误出现的原因是因为我后面引用的Couchbase.NetClient,所以项目中的Common.Logging用的2.0.0.0版本。
在网上搜索了一些资料,说是可以通过在配置文件中设置程序集重定向,可以将低版本的程序集重定向到高版本的程序集上面去,于是将项目中的Common.Logging版本升级到了3.0.0.0,然后做了如下设置:
<dependentAssembly> <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly>
这个时候程序集已经能够正确加载了,可是运行时问题又来了:
这是在Couchbase.NetClient的程序集中报的错误,反编译后找到报错的位置如下:
可是在Common.Logging的3.0.0.0版本中是有这个方法的,然后我就不知道怎么办了。。。
于是做了下面一些尝试:
1.下载Quartz的驱动源代码,把它对Common.Logging程序集的引用由3.0.0.0改成2.0.0.0,然后生成重新引用,可是可是。。好像是指定了发行者策略,也就是必须要引用2.3.1.0这个程序集,就算配置成跳过发现者策略还是没有用,如图:
但是这个2.3.1.0版本的Quartz还是引用的Common.Logging的3.0.0.0版本啊,我去啊。。
2.本来准备放弃的,然后还是试了下降低Couchbase.NetClient的版本,希望低版本的不用Commom.Logging这个日志框架(事实也正是如此),结果之前项目里面写的代码基本不能用了,然后我果断还是放弃了,准备换一个定时框架了。
希望哪位大神能看到,告诉我该怎么弄,不胜感激!!
重现问题:
Install-Package CouchbaseNetClient
Install-Package Quartz
然后分别简单的调用下。
补充:
这已经是我第二次遇到这个问题了,之前一个是Memcached的驱动依赖log4net,又是™日志框架,吾觉得第三方框架依赖其它第三方框架,又不保持版本更新的都是耍流氓,害的我上次改另外一个框架的源代码,改的想哭啊。。。
把oldVersion="0.0.0.0-2.0.0.0"改为oldVersion="0.0.0.0-3.0.0.0"试试
不知道为什么要用Couchbase.NetClient,直接用EnyimMemcached就行了,Couchbase.NetClient用的也是EnyimMemcached。
重定向试了的。。
@initial2013: 如果3.0.0.0中确实有GetCurrentClassLogger()方法,重定向应该可以的
@dudu:
@initial2013: 把oldVersion="0.0.0.0-2.0.0.0"改为oldVersion="0.0.0.0-3.0.0.0"试试,这个试过了吗?
@dudu: 没有报找不打程序集的错误,说明已经重定向成功了,跟这个没关系。
这种有源码的。直接下源码重新生成了
我有试过把Quartz驱动的源码重新生成,但是不知道怎么改程序集的发行者策略和PublicKeyToken。
使用nuget管理,应该可以避免这种问题
有没有可能将2个版本的DLL都放进来,old.dll,new.dll,让那2个框架各自引用呢?
http://stackoverflow.com/questions/5737256/help-me-get-two-branched-third-party-dlls-with-the-same-name-to-play-nice