小编Yur*_*huk的帖子

Newtonsoft Json.NET版本不兼容(DLL地狱)

Newtonsoft.Json发布具有相同强名称的不兼容版本,仅更改文件版本.

根据MSDN:

具有相同强名称的程序集应该相同.

因此,如果我们无法控制的其他应用程序将不同版本的Newtonsoft.Json.dll放入GAC,我们的应用程序就会中断.

有没有办法强制.NET加载我们需要的特定版本?

更新:

让我更深入地解释这个问题:

在.NET中,据我所知,在CLR尝试解决它们并失败之前,没有机制来解析程序集.

只有AppDomain.AssemblyResolve事件,它仅在未解析程序集时触发.通常它就足够了.

但是在Newtonsoft.Json的情况下,它并没有解决程序集,但它只是加载错误的程序集.

发生这种情况是因为Newtonsoft.Json发布了具有相同强名称的不兼容版本.

例:

假设我们的应用程序针对NJdll编译(程序集版本1.0,文件版本1.0)

然后一些其他应用程序,将其他不兼容版本的相同dll放入GAC NJdll(程序集版本1.0,文件版本1.1)

因为它们只更改文件版本而不更改程序集版本,所以这两个程序集具有相同的强名称.

因此,对于我们的应用程序.NET尝试解析NJdll(程序集版本1.0),它会在GAC中看到dll并加载它.(因为.NET总是喜欢从GAC组装来装配"bin"文件夹)

但装载的装配是错误的.它的文件版本为1.1,与1.0版本不兼容.

因为两个程序集都具有相同的程序集版本,所以.NET看不到它们之间的任何差异.但是当它实际上尝试解决内部的某个类或成员时,它会失败,因为它在版本1.1中已更改.

并且整个应用程序因不可预测的错误而失败.

最糟糕的是,即使我的应用程序没有将newtonsoft.json.dll放入GAC,我控制之外的其他一些应用程序也会将不同版本的newtonsoft.json.dll放入GAC - 我的应用程序会因不可预测而中断例外.

所以我的问题是,在.NET加载错误之前,我可以首先加载正确的程序集吗?

更新

https://github.com/JamesNK/Newtonsoft.Json/issues/615 https://github.com/JamesNK/Newtonsoft.Json/issues/1001

这个问题的问题已经结束,评论显示Newtonsoft.Json的作者不了解.NET版本以及为什么这很重要.

.net versioning json.net global-assembly-cache .net-assembly

21
推荐指数
1
解决办法
4436
查看次数