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版本控制以及为什么这很重要。
https://stackoverflow.com/questions/31608983
复制相似问题