首页 新闻 会员 周边 捐助

.NET中程序集版本问题

0
悬赏园豆:100 [待解决问题]

问题是这这样的,我的项目中需要引用两个第三方框架(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,又是™日志框架,吾觉得第三方框架依赖其它第三方框架,又不保持版本更新的都是耍流氓,害的我上次改另外一个框架的源代码,改的想哭啊。。。

zengding的主页 zengding | 初学一级 | 园豆:103
提问于:2015-01-17 14:08
< >
分享
所有回答(5)
0

把oldVersion="0.0.0.0-2.0.0.0"改为oldVersion="0.0.0.0-3.0.0.0"试试

不知道为什么要用Couchbase.NetClient,直接用EnyimMemcached就行了,Couchbase.NetClient用的也是EnyimMemcached。

dudu | 园豆:29737 (高人七级) | 2015-01-17 14:34

重定向试了的。。

支持(0) 反对(0) zengding | 园豆:103 (初学一级) | 2015-01-17 14:39

@initial2013: 如果3.0.0.0中确实有GetCurrentClassLogger()方法,重定向应该可以的

支持(0) 反对(0) dudu | 园豆:29737 (高人七级) | 2015-01-17 14:41

@dudu: 

支持(0) 反对(0) zengding | 园豆:103 (初学一级) | 2015-01-17 15:01

@initial2013: 把oldVersion="0.0.0.0-2.0.0.0"改为oldVersion="0.0.0.0-3.0.0.0"试试,这个试过了吗?

支持(0) 反对(0) dudu | 园豆:29737 (高人七级) | 2015-01-17 15:45

@dudu: 没有报找不打程序集的错误,说明已经重定向成功了,跟这个没关系。

支持(0) 反对(0) zengding | 园豆:103 (初学一级) | 2015-01-17 15:46
0

这种有源码的。直接下源码重新生成了

吴瑞祥 | 园豆:29449 (高人七级) | 2015-01-17 15:14

我有试过把Quartz驱动的源码重新生成,但是不知道怎么改程序集的发行者策略和PublicKeyToken。

支持(0) 反对(0) zengding | 园豆:103 (初学一级) | 2015-01-17 15:18
0

使用nuget管理,应该可以避免这种问题

☆暀倳隨颩☆ | 园豆:202 (菜鸟二级) | 2015-01-28 20:55
0

有没有可能将2个版本的DLL都放进来,old.dll,new.dll,让那2个框架各自引用呢?

hexllo | 园豆:318 (菜鸟二级) | 2015-02-03 11:57
0

http://stackoverflow.com/questions/5737256/help-me-get-two-branched-third-party-dlls-with-the-same-name-to-play-nice

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2015-04-15 18:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册