Newtonsoft Json.NET版本不兼容(DLL地狱)怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (68)

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中进行了更改。

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

所以我的问题是,我可以如何加载正确的程序集,在.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

扫码关注云+社区