23

私は、次のオブジェクトがあります。Json.NETは単純なオブジェクトのシリアライズにSystem.Xml.Linq v5.0.5を必要とするのはなぜですか?

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. 

を私は最後の1時間は、依存関係がどこから来るのか、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) 

..butなぜそれがそのルートを取るのでしょうか?

更新

簡単なテストケースも失敗します。このプロジェクトは、以前に働いている2

[Fact] 
public void should_be_Able_to_Serialize_settings() 
{ 
    JsonConvert.SerializeObject(new ProjectInfo {ConnectionStringName = "Arne"}); 
} 

を更新。同僚のコンピュータでも動作します。私が見ることのできる唯一の違いは、VStudio 2015 アップデート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プロジェクトで何かですか?)

Update3と

ここ依存関係です。

enter image description here

更新:

プロジェクトファイルに

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:

彼らはJson.NETが正確なバージョンことを参照しようとすることを示して

私の問題は、存在しないアセンブリを読み込もうとすると拡張機能が動作しないということです。私の理解から、v5.0.5は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> 
+0

問題を示す短い完全なプログラムを表示できますか? 'settings'には何がありますか? –

+0

newtonsoft.json v7.0.1 via nuget – jgauffin

+0

私はVStudio 2015アップデート1を持っています – jgauffin

答えて

2

Json.NETは、jsonをxmlに変換するためにSystem.Xml.Linqを使用します。

依存関係のいずれの型も参照していない限り、ライブラリの依存関係なしでコンパイルできるようになります。これは正常です。私はNHibernateのIesi.Collections依存関係で同じ問題がありました。

私はJson.Netソースコードを見て、System.Xml.Linqのusingステートメントは.Netバージョンの条件付きです。あなたとあなたの同僚は同じ.Net版を実行していますか?最近あなたのマシンで.Netを変更しましたか?

NHibernateとすべての依存関係を完全に削除することをお勧めします。その後、NuGetを使ってJson.Netをインストールします。 NuGetは自動的にすべての依存関係を追加し、必要なアセンブリバインディングリダイレクトを実行します。

NuGetを使いたくない場合でも、diffを実行してどのような変更が行われているかを確認してください。

関連する問題