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



Newtonsoft.Json发布了具有相同强名称的不兼容版本,只更改了File版本。

根据MSDN:

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

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

有什么方法可以强制.NET加载我们需要的特定版本吗?

更新:

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

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

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

但在Newtonsoft.Json的情况下,它并不能解决程序集,只是加载了错误的程序集。

之所以会出现这种情况,是因为Newtonsoft.Json发布了具有相同强名称的不兼容版本。

示例:

假设我们的应用程序是根据N.J.dll编译的(程序集版本1.0,文件版本1.0(

然后一些其他应用程序,将同一dll的其他不兼容版本放入GAC N.J.dll(程序集版本1.0,文件版本<strong+1.1>(

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

因此,对于我们的应用程序.NET试图解析N.J.dll(程序集版本1.0(,它会在GAC中看到dll并加载它

但加载的程序集是错误的。它的文件版本为1.1,与1.0版本不兼容。

因为这两个程序集都有相同的程序集版本,.NET看不到它们之间有任何区别。但是,当它实际尝试解析内部的某个类或成员时,它失败了,因为它在1.1版本中进行了更改。

整个应用程序会出现不可预测的错误而失败

最糟糕的是,即使我的应用程序没有将newtonsoft.json.dll放入GAC,我无法控制的其他应用程序也会将不同版本的newtonsoft.json.dll放入GAC——我的应用软件会出现不可预测的异常。

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

更新

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

这个问题的问题以注释结束,该注释表明Newtonsoft.Json的作者不理解.NET版本控制以及为什么这很重要。

程序集加载程序将只探测丢失的程序集,即尚未加载的程序集。如果将DLL部署到应用程序安装文件夹,然后在应用程序启动时显式加载它,则程序集加载程序将不会尝试从GAC再次加载它。

可以使用Assembly.LoadFrom方法显式加载程序集。

请参阅https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110(.aspx获取详细信息。

相关内容

  • 没有找到相关文章

最新更新