根据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”文件夹的汇编)
因为两个程序集具有相同的程序集版本,.NET在它们之间看不到任何区别.但是,当它实际上尝试解决一些类或内部的成员,它失败,因为它在版本1.1中更改.
整个应用程序失败,出现不可预知的错误.
所以我的问题是,我可以一些如何装载正确的程序集第一,在.NET加载错误之前?
更新
https://github.com/JamesNK/Newtonsoft.Json/issues/615
https://github.com/JamesNK/Newtonsoft.Json/issues/1001
您可以使用Assembly.LoadFrom方法显式加载程序集.
有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx.