【发布时间】:2023-04-04 05:17:02
【问题描述】:
我有以下对象:
public class ProjectInfo
{
public string ConnectionStringName { get; set; }
public string DefaultEntityNamespace { get; set; }
public string DefaultSharedNamespace { get; set; }
public string DefaultTestNamespace { get; set; }
public string SqlProviderName { get; set; }
}
我尝试对(在 VSIX 项目中)进行简单的序列化:
var settings = new ProjectInfo { ConnectionStringName = "SomeName" };
var json = JsonConvert.SerializeObject(settings);
这给了我:
An exception of type 'System.IO.FileNotFoundException' occurred in Newtonsoft.Json.dll but was not handled in user code
Additional information: Could not load file or assembly 'System.Xml.Linq, Version=5.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
我花了最后一个小时试图弄清楚依赖项来自哪里或为什么 Json.NET 尝试使用该命名空间。我的任何项目都没有引用 System.Xml.Linq。
从堆栈跟踪中我可以看到:
at Newtonsoft.Json.Converters.XmlNodeConverter.CanConvert(Type valueType)
at Newtonsoft.Json.JsonSerializer.GetMatchingConverter(IList`1 converters, Type objectType)
at Newtonsoft.Json.Serialization.DefaultContractResolver.InitializeContract(JsonContract contract)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType)
at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType)
at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value)
..但为什么要走那条路?
更新
一个简单的测试用例也失败了:
[Fact]
public void should_be_Able_to_Serialize_settings()
{
JsonConvert.SerializeObject(new ProjectInfo {ConnectionStringName = "Arne"});
}
更新 2
这个项目以前曾工作过。它也适用于同事的计算机。我能看到的唯一区别是我已升级到 VStudio 2015 Update 1。 (或者我在某个地方犯了一个愚蠢的错误)。但我也对我同事使用的最新版本进行了硬重置。
为什么会尝试引用 System.Linq.Xml v5.0.5? v4.0.0 不是 .NET 4.5 的标准版本吗? v5.0.5属于.NET的哪个版本?
(我以前从未遇到过类似的 Json.NET 问题。是 VStudio 2015 / .NET 4.5.2 / VSIX 项目的问题吗?)
更新3
这里是依赖项。他们表明 Json.NET 试图引用那个确切的版本:
更新:
项目文件中的Json.NET引用:
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=c70b2336aed9f731, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
编辑 4:
我的问题是扩展无法工作,因为它试图加载一个不存在的程序集。据我了解,v5.0.5 是一个silverlight 程序集。而且我不使用silverlight。
我尝试添加程序集重定向,但似乎不起作用。
<dependentAssembly>
<assemblyIdentity name="System.Xml.Linq" publicKeyToken="31bf3856ad364e35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.5.0" newVersion="4.0.0.0"/>
</dependentAssembly>
【问题讨论】:
-
你能展示一个简短但完整的程序来演示这个问题吗?
settings中有什么内容? -
我怀疑控制台应用程序正在从 GAC 加载依赖项,而 vsix 项目没有这样做。 Newtonsoft 确实对它有依赖。 i.imgur.com/xn6MVDx.png
-
好吧,我可以告诉你,
XmlNodeConverter是内置转换器之一,它在使用默认合约解析器反序列化的每个对象上进行测试。您可以在BuiltInConverters数组here 中看到它。这不适用于PORTABLE40,但除此之外它总是会被击中。因此,您必须能够引用其依赖项。 (该数组作为调用GetMatchingConverter的第一个参数传递,在您的堆栈跟踪中可以看到。) -
在您的 vsix 项目中添加对
System.Xml.Linq的引用有什么问题? -
添加项目引用后能否分享您的项目文件(只是文件)?有些东西告诉我你从 NuGet 包中选择了错误的资产......
标签: c# json.net visual-studio-2015 visual-studio-extensions .net-4.5.2