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

前端之家收集整理的这篇文章主要介绍了Newtonsoft Json.NET版本不兼容(DLL地狱)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Newtonsoft.Json发行具有相同强名称的不兼容版本,只能更改文件版本.

根据MSDN

Assemblies that have the same strong name should be identical.

@H_403_6@

因为这样我们的应用程序中断,如果我们控制的其他应用程序将不同版本的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,文件版本1.1)

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

所以对于我们的应用程序.NET尝试解决N.J.dll(程序集版本1.0),它看到GAC中的dll并加载它. (因为.NET总是喜欢从GAC汇编从“bin”文件夹的汇编)

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

因为两个程序集具有相同的程序集版本,.NET在它们之间看不到任何区别.但是,当它实际上尝试解决一些类或内部的成员,它失败,因为它在版本1.1中更改.

整个应用程序失败,出现不可预知的错误.

所以我的问题是,我可以一些如何装载正确的程序集第一,在.NET加载错误之前?

更新

https://github.com/JamesNK/Newtonsoft.Json/issues/615
https://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.

猜你在找的Json相关文章