【发布时间】:2016-05-04 14:56:33
【问题描述】:
我对 NewtonSoft 有疑问。
例如,我有一个包含 3 个项目的解决方案。项目 A 有项目 B 和项目 C 的参考点,项目 B 也有项目 C 的参考点。B 和 C 都有 NewtonSoft 程序集。 C项目有函数获取JsonMediaTypeFormatter:
new JsonMediaTypeFormatter()
该函数被所有三个项目调用。项目 B 和 C 都可以毫无问题地调用该函数。但是当项目A调用该函数时,它会抛出错误:
Method not found: 'Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(Boolean)'
我注意到即使项目 A 也没有 NewtonSoft 引用,当项目构建时,Newtonsoft.json.dll 被复制到它的 bin\Debug 文件夹中。我猜这是因为 Newtonsoft 程序集在项目 B 和 C 中的 Copy Local optoin 设置为 true。如果我从项目 A 的 bin\Debug 文件夹中手动删除此 dll,问题就解决了。
我的问题是为什么项目 A 会出现异常,除了从项目 A 的 bin\Debug 文件夹中手动删除 Newtonsoft dll 之外,还有其他解决方案吗?将 Copy Local 设置为 false 不是一个选项,因为它会阻止 dll 部署到项目 B 和 C 的自己的 bin 文件夹中。
任何建议都将不胜感激。
更新
这是我的代码 sn-p
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using System.Net.Http.Formatting;
var jsonSerializerSettings = new JsonSerializerSettings
{
Formatting = Formatting.Indented,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var dateConverter = new IsoDateTimeConverter
{
DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"
};
jsonSerializerSettings.Converters.Add(dateConverter);
var formatter = new JsonMediaTypeFormatter
{
//SerializerSettings = jsonSerializerSettings
};
如果我注释掉 SerializerSettings,它就可以正常工作。
如果我取消注释此行,应用程序将返回此类问题。
如果我只是将空白设置传递给它
var formatter = new JsonMediaTypeFormatter
{
//SerializerSettings = new JsonSerializerSettings{}
};
我收到错误:
找不到方法:'Void System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.set_SerializerSettings(Newtonsoft.Json.JsonSerializerSettings)'
我认为可能与项目内部不同的 System.Net.Http.Formatting 引用有关,但我检查了引用设置,它们都是指向文件的
packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
这段代码在C项目中,只有被A项目调用失败,B项目和C项目可以正常调用。从 Project A bin\Debug 文件夹中删除 NewtonSoft.Json.dll 后,它也可以在项目 A 调用中使用。
你知道发生了什么吗?以及如何检查项目中是否仍有不同的参考版本冲突?
谢谢,
【问题讨论】:
-
我刚刚更新了我上面的问题。谢谢
标签: msbuild json.net system.net