根据MSDN:
Assemblies that have the same strong name should be identical.
因为这样我们的应用程序中断,如果我们控制的其他应用程序将不同版本的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版本控制,为什么这很重要.
您可以使用Assembly.LoadFrom方法显式加载程序集.
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。