マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

NuGetは非常に便利だが、この問題がよく起きるようになった。

問題の内容

以下のようなエラーが出た場合の対処。

  • warning MSB3247: 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。
  • warning MSB3247: Found conflicts between different versions of the same dependent assembly.

問題の対策

ビルド出力ログを確認して、バインディング リダイレクトを、設定する。

詳細

バインディング リダイレクトが設定されていない場合、
以下のバージョン不一致のケースでも、競合が報告される。

  • 下位モジュールで、下位バージョンの依存関係モジュールを使用
  • 上位モジュールで、上位バージョンの依存関係モジュールを使用

調査方法

ビルド出力の詳細化

  • ビルド出力のレベルを上げる。
  • Visual Studioの場合
    • [ツール] → [オプション] → [プロジェクトおよびソリューション] → [ビルド/実行]で、
    • [MSBuild プロジェクト ビルドの出力の詳細(V)]を"詳細"にセットする。
  • MSBuildの場合
    • -verbosity(-v)スイッチに
    • levelオプションとして「d[etailed]」を指定する。
      • q[uiet]
      • m[inimal]
      • n[ormal]
      • d[etailed]
      • diag[nostic]
  • 以下、"詳細"のビルド出力。
yyyy/MM/dd HH:mm:ss にビルドを開始しました。
ノード 1 上のプロジェクト "XXXX.sln" (既定のターゲット)。
ValidateSolutionConfiguration:
  ソリューション構成 "Debug|Any CPU" をビルドしています。
プロジェクト "XXXX.sln" (1) は、ノード 1 上に "XXXX.csproj" (2) をビルドしています (既定のターゲット)。
ResolveAssemblyReferences:
  競合を解決して警告を消去するために、app.config でアセンブリ "YYYY, Culture=neutral, PublicKeyToken=YYYY" をバージョン "6.9.9.0" [] からバージョン "6.9.11.0" [YYYY.dll] にマップし直してください。
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3247: 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。 [XXXX.csproj]
GenerateTargetFrameworkMonikerAttribute:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateTargetFrameworkMonikerAttribute" を省略します。
CoreCompile:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "CoreCompile" を省略します。
_CopyAppConfigFile:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "_CopyAppConfigFile" を省略します。
CopyFilesToOutputDirectory:
  XXXX -> XXXX.dll
プロジェクト "XXXX.csproj" (既定のターゲット) のビルドが完了しました。
プロジェクト "XXXX.sln" (既定のターゲット) のビルドが完了しました。

ビルドに成功しました。

"XXXX.sln" (既定のターゲット) (1) -> "XXXX.csproj" (既定のターゲット) (2) -> (ResolveAssemblyReferences ターゲット) -> 
  C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(1605,5): warning MSB3247: 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。 [XXXX.csproj]

    1 個の警告
    0 エラー

経過時間 00:00:00.nn

※ 伏せているけど、上記は、バージョン番号からしてMySQL。
このように、どの依存アセンブリでバージョン間の競合が起きているかも確認できる。

ツール(AsmSpy?)を使用

  • 以下のように使用する(net, netstd, netcore等で利用可能)。
    AsmSpy C:\...\bin

対策方法

依存アセンブリのバージョンを一致させる

  • この方法は、下位モジュールがNuGetパッケージだったりすると適用できない。
  • このような場合、以下のバインディング リダイレクトの方法を適用する。

configファイルにバインディング リダイレクト セクションを追加する。

以下のように、*.configファイルの、
configuration -> runtimeセクション以下に
バインディング リダイレクトを設定する。

<dependentAssembly>
  <assemblyIdentity name="YYYY" publicKeyToken="YYYY" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-6.9.11.0" newVersion="6.9.11.0" />
</dependentAssembly>

※ 上記の「マップし直してください。」のバージョンを設定する。

Projectファイルに自動バインディング リダイレクトを設定する。

  • 手順
  • (1)Projectファイルに以下を追加する。
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  • (2)警告を確認する。
    重大度レベル	コード	説明	プロジェクト	ファイル	行	抑制状態
    警告 "XXXXXXXXXX" の異なるバージョン間で、解決できない競合が見つかりました。
    これらの参照上の競合は、ログの詳細度が詳細に設定されている場合にビルド ログにリストされます。
  • (3)対象アセンブリのdependentAssemblyを削除する。
    <dependentAssembly>
      <assemblyIdentity name="XXXXXXXXXX" publicKeyToken="XXXXXXXXXX" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-n.0.0.0" newVersion="n.0.0.0" />
    </dependentAssembly>
  • (4)以下の警告をダブルクリックしダイアログで「はい」を押下すると、自動的に必要なバインドを追加できる。
    同じ依存アセンブリの異なるバージョン間で競合が見つかりました。
    Visual Studio では、この警告をダブルクリックする (または選択して Enter キーを押す) ことで、この競合を修正できます。
    または、アプリケーション構成ファイル内の "runtime" ノードに、次のバインド リダイレクトを追加します

.NET Coreの場合

  • .NET Coreには、バインディング リダイレクトが無い。
  • 特に、Microsoft.AspNetCore?.App使用時などで、MSB3277が出るので、
    ログを確認し、問題を起こしているバージョン間の新しい方(若しくは最新版)
    NuGetパッケージを上位プロジェクトから上書きインストールすれば良さそう。

参考


Tags: :.NET開発, :デプロイ, :デバッグ, :NuGet


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-12-05 (水) 09:08:27 (12d)