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