gpt4 book ai didi

.net - Newtonsoft Json.NET版本不兼容(DLL hell )

转载 作者:行者123 更新时间:2023-12-02 07:37:29 26 4
gpt4 key购买 nike

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

根据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 版本中发生了更改。

整个应用程序因不可预测的错误而失败。

最糟糕的是,即使我的应用程序没有将 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 版本控制以及为什么这很重要。

最佳答案

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

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

参见https://msdn.microsoft.com/en-us/library/dd153782(v=vs.110).aspx了解更多信息。

关于.net - Newtonsoft Json.NET版本不兼容(DLL hell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com