C#

警告:MSB3277が出た時の対処法メモ

警告 : 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。
との警告が少し前に出たのでその時行った対処法をまとめます。

2.png

前提

今回のケースでは、ソリューションをメインとなるプログラムのコード(以下、コード側)のプロジェクトとそれのテストプロジェクト(以下、テスト側)から構成されています。
また、テスト側のプロジェクトをスタートアッププロジェクト、つまりプライマリとして設定しています。
また、テスト側のプロジェクトはコード側のプロジェクトに依存しています。

  • ソリューション
    • テスト側のプロジェクト(プライマリ)
    • コード側のプロジェクト

(上記:ソリューションの構成イメージ)

1.メッセージの通りに出力を詳細にする(Optional)

まずは警告メッセージの通りにログの詳細を上げて問題箇所がわかるようにします。
[ツール]→[オプション]からVSのオプションを表示します。続いて[プロジェクトおよびソリューション]→[ビルド/実行]から[MSBuild プロジェクト ビルドの出力の詳細(V)]を"詳細"にセットします(下図)。
無題.png

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をインストールし、再度ビルドしたところ、
1.png

警告が消えました!よかった!

まとめ

  • 警告が出たときはメッセージを読む
    • 状況に応じて、出力のレベルを上げる
  • 競合しているライブラリのバージョンを見比べる
    • それに依存するライブラリの条件も確認する
  • プライマリ側のライブラリを最新化し、再度ビルドする

関連リンク