首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Newtonsoft Json.NET版本不兼容(DLL地狱)

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

Stack Overflow用户
提问于 2015-07-24 19:06:28
回答 1查看 5.8K关注 0票数 22

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

根据MSDN的说法

具有相同强名称的

程序集应该相同。

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

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

更新:

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

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

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

但是在使用Newtonsoft.Json 的情况下,它不会失败地解析程序集,而只是加载了错误的the。

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

示例:

假设我们的应用程序是针对N.J.dll (汇编版本1.0,文件版本1.0)编译的

然后,将同一dll的其他不兼容版本放入GAC N.J.dll (汇编版本1.0,文件版本1.1)中。

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

因此,对于试图解析N.J.dll (汇编版本1.0)的应用程序.NET,它会在GAC中看到dll并加载它。(,因为.NET总是喜欢使用GAC中的程序集来处理“”文件夹中的程序集)

但是加载的程序集是错误的。它的文件版本为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版本控制以及为什么这很重要。

EN

回答 1

Stack Overflow用户

发布于 2016-09-29 08:24:22

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

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

有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31608983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档