警告 : 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。
との警告が少し前に出たのでその時行った対処法をまとめます。
前提
今回のケースでは、ソリューションをメインとなるプログラムのコード(以下、コード側)のプロジェクトとそれのテストプロジェクト(以下、テスト側)から構成されています。
また、テスト側のプロジェクトをスタートアッププロジェクト、つまりプライマリとして設定しています。
また、テスト側のプロジェクトはコード側のプロジェクトに依存しています。
- ソリューション
- テスト側のプロジェクト(プライマリ)
- コード側のプロジェクト
(上記:ソリューションの構成イメージ)
1.メッセージの通りに出力を詳細にする(Optional)
まずは警告メッセージの通りにログの詳細を上げて問題箇所がわかるようにします。
[ツール]→[オプション]からVSのオプションを表示します。続いて[プロジェクトおよびソリューション]→[ビルド/実行]から[MSBuild プロジェクト ビルドの出力の詳細(V)]を"詳細"にセットします(下図)。
2.詳細になったビルド出力から問題箇所を探る
もう一回ビルドをかけるとたくさんのメッセージが表示されるので[出力]ウィンドウの内容を"MSB3277"で検索すると
C:\(中略)\Microsoft.Common.CurrentVersion.targets(1987,5): warning MSB3277: 同じ依存アセンブリの異なるバージョン間で、解決できない競合が見つかりました。これらの参照上の競合は、ログの詳細度が詳細に設定されている場合にビルド ログにリストされます。
ここから上に向かって辿ると
"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" と"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed" の間で競合が発生しました。
プライマリであるため、"Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"が選択されました。"Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"はプライマリではありませんでした。
...最初この文章を見たとき、一瞬なんのことがよくわかりませんでした。
要約すると、
- テスト側 Newtonsoft.Json(9.0.0) (プライマリ)
- コード側 Newtonsoft.Json(10.0.0)
「同じライブラリがバージョン違いで存在しているので警告を出しました。
今回はプライマリの方を選んでビルドしました」とのことです。
2.5. 問題箇所を確認する
今回のケースではプライマリ側のNewtonsoft.JsonがMicrosoft.Extensions.DependencyModel(1.1.0)から参照されていたのでそのバージョンのNugetのページをチェックします。
するとDependenciesがNewtonsoft.Json (>= 9.0.1)ということがわかりました。
これならテスト側のバージョンを10.0.0以上にすれば問題が解消できそうです。
3. 問題となった側のNugetライブラリを最新にする
NugetからNewtonsoft.Jsonをインストールし、再度ビルドしたところ、
警告が消えました!よかった!
まとめ
- 警告が出たときはメッセージを読む
- 状況に応じて、出力のレベルを上げる
- 競合しているライブラリのバージョンを見比べる
- それに依存するライブラリの条件も確認する
- プライマリ側のライブラリを最新化し、再度ビルドする