为什么Newtonsoft.Json容易出现汇编版本冲突?

我注意到我们经常在项目中遇到程序集版本冲突,90%的时候它是Newtonsoft.Json的底部。 有关于Newtonsoft.Json冲突的SO有很多问题 – 臭名昭着的“无法加载文件或程序集’Newtonsoft.Json,Version = 6.0.0.0”。 搜索“汇编’Newtonsoft.Json,Version = 6.0.0.0”会提出37个问题 – 其中很多都是高度赞成的。 或者这个约为4.5.0.0 。

是否有任何解释为什么这种情况经常发生在该库而不是其他库中,为什么它是如此一致的汇编版本冲突源? 它肯定比其他库更频繁地发生。

为什么Newtonsoft.Json容易出现汇编版本冲突?

基本上,因为它通常被其他库应用程序代码用作下游依赖项。 如果你有包A (在这种情况下,Netwonsoft.Json),你有:

 SomeApp -> A 

那一切都很棒; 但如果你有:

 SomeApp -> A -> SomeLib -> A 

要么:

 SomeApp -> SomeLib -> A -> SomeOtherLib -> A 

要么:

 SomeApp -> A -> SomeLib -> A -> SomeOtherLib -> A 

要么:

 SomeApp -> A -> SomeLib -> A -> SomeOtherLib -> YetAnotherLib -> A -> MeTooLib -> A 

然后,所有引用的A版本都必须相同或者需要使用合适的程序集绑定重定向,以允许期望版本7的lib在不抛出绑定问题的情况下静默接受版本10。 当然,如果API在旧库使用的方法中在版本7和10之间不是二进制兼容的,那么你仍然完全没有运气。

所以基本上:这是一个流行和重复使用的问题,以及其他库不能及时了解其下游依赖关系的症状。 Json.NET比其他库看到的更多, 因为它比许多其他库使用得更多,包括作为其他库的依赖。

请注意,NuGet会自动添加绑定重定向。