- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我在谷歌上花了很长时间,所以如果这是一个简单的修复请原谅我,但我找不到任何与 C# 中这个特定问题的修复相关的内容。 当尝试使用以下代码时,出现此错误: string obj = JsonConver
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
我正在尝试重新创建这个 json: { "request": { " TestRequest": { "OrderID": {
我正在测试我的 Web API。模拟数据我有这个: var objs = ((JArray)JsonConvert.DeserializeObject("{ \"PrintId\":10,\"Head
目前正在尝试使用 fixer.io API 在 C# 中创建货币转换。 我在从 Twitter API 解析 JSON 时使用了与下面类似的方法,并且没有任何问题,我不完全确定这里发生了什么。 API
我正在尝试建立 Mike Jansen 的 JIRA REST Client ,我正在尝试提取 JIRA 版本信息。我是 JSON 的新手,所以我不确定这只是格式问题还是什么。 调试时,我有以下标记:
我正在尝试使用 将对象动态序列化到即时窗口中 Newtonsoft.Json.JsonConvert.SerializeObject(myObj); 但是我得到以下错误 The type 'Newto
我无法在 Visual Studio 2013 中构建解决方案。 这发生在我将我的 JSON.NET 包更新到 6.0.1 之后。在此之前,它就像一个魅力。 有什么想法吗? PS:这可能是关于 OWI
当有如下代码时 var TermSource = token.Value("annotations") .Values("Term Source") .FirstOrDefault
我需要将选中的复选框代码从 JavaScript 传递给 C#。我能够通过 JSON 发送代码。我的 JSON 值以 JArray 的形式出现。我在标题中得到了异常(exception)。 JSON:
注意:解决重定向问题后,我遇到了另一个问题,即出现错误“无法将 Newtonsoft.Json.Linq.JArray 转换为 Newtonsoft.Json.Linq.JToken”。因此,在我的回
我有以下简单的 POCO: public class ApiKey { public ApiKey(string key, string owner, List claims = nu
我查过这个问题,但我没有看到太多答案,显然没有一个有帮助,否则我不会问。我是 .NET 新手。 我的本地环境是Win7,Microsoft Virtual Web Developer 2010 Exp
好的-我已经将这个问题打了几个小时。是时候寻求帮助了。 我刚刚将Web应用程序项目升级到ASP.NET MVC 4 RC和新的WebApi。 我的Web api方法现在返回EMPTY json“{}”
我想忽略类中的某些属性,但出于多种原因我想保留类 POCO。因此我不想引入对 Json.NET 的依赖,也不想使用 JsonIgnoreAttribute。 有没有办法自定义契约(Contract)解
我正在尝试修复我编写的 WinForms 程序中的错误;我正在解析一个 JSON 字符串,然后将一些结果放入各种变量中。 有时,JSON 的特定元素不存在(出于真正的原因),因此我尝试使用以下代码来处
我只是尝试使用 C# 中的 Newtonsoft JSON 库将文件中的一些 JSON 反序列化为对象列表。以下是 MeetingFile.txt 文件的内容: [ { "People":
这是一个非常奇怪的错误发生。我有这些对象: public class Mobile_SettingModels { public string Token { get; set; }
我粘贴了 http://www.codeproject.com/Tips/789481/Bridging-the-Gap-between-Linqpad-and-Visual-Studio 中的代码进
这个问题在这里已经有了答案: Can I optionally turn off the JsonIgnore attribute at runtime? (3 个答案) 关闭 4 年前。 我目前正
我是一名优秀的程序员,十分优秀!