Newtonsoft Json.NET版本不兼容(DLL地狱)
Newtonsoft.Json发行具有相同强名称的不兼容版本,只能更改文件版本.
根据MSDN:
因为这样我们的应用程序中断,如果我们控制的其他应用程序将不同版本的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 这个问题的问题被关闭,评论显示,Newtonsoft.Json的作者不明白.NET版本控制,为什么这很重要.
组装装载机只会探测缺少的组件,即尚未加载的组件.如果将DLL部署到应用程序安装文件夹,那么在应用程序启动时显式加载它,那么程序集加载程序将不会再尝试从GAC加载它.
您可以使用Assembly.LoadFrom方法显式加载程序集. 有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |