为什么Newtonsoft.Json容易发生程序集版本冲突?

5
我注意到我们的项目经常出现程序集版本冲突,其中90%是由Newtonsoft.Json引起的。在SO上有许多关于Newtonsoft.Json冲突的问题,比如臭名昭著的“无法加载文件或程序集'Newtonsoft.Json,Version=6.0.0.0”。搜索"assembly 'Newtonsoft.Json, Version=6.0.0.0"可得37个问题,其中很多被高度赞同。或者看看这个关于4.5.0.0的问题

为什么这种情况经常发生在这个库而不是其他库,为什么它成为程序集版本冲突的一个持续来源?是否有任何解释?它肯定比其他库更容易出现这种情况。


这些版本已经过时了。当前版本是10.x。很多年前人们就学会了避免在他们的软件包中硬编码特定版本。如果有任何问题,那就是使用过时的软件包版本,无论是Json.NET还是依赖于古老Json.NET版本的任何其他软件包。 - Panagiotis Kanavos
ServiceStack可能吗?当许可条款更改并遇到此类不兼容性时,许多人仍停留在2.0、3.0上。 - Panagiotis Kanavos
1个回答

11

为什么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的库默默地接受版本10而不抛出绑定问题。当然,如果API在7和10版本之间不是二进制兼容的话,您仍然完全没有运气,因为旧库使用的方法无法使用。

所以基本上,这是一个流行度和重用的问题,也是其他库没有跟上其下游依赖关系的症状。Json.NET比其他许多库更容易出现这种情况,因为它被使用得更频繁,包括作为其他库的依赖项。

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


1
只是为了强调Newtonsoft的普及程度:微软的JavascriptSerializer文档建议使用Newtonsoft库。一个库的官方文档直接引导人们去使用竞争库是不寻常的。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接