「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[NuGet]] --[[MSBuild]] * 目次 [#h43555c0] #contents *概要 [#gc03ed29] NuGetは非常に便利だが、この問題がよく起きるようになった。 **問題の内容 [#l8d7ea1b] 以下のようなエラーが出た場合の対処。 -warning MSB3247: 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。 -warning MSB3247: Found conflicts between different versions of the same dependent assembly. **問題の対策 [#p8fe593d] [[ビルド出力ログ>#k4519d36]]を確認して、バインディング リダイレクトを、設定する。 *詳細 [#w8916156] バインディング リダイレクトが設定されていない場合、~ 以下のバージョン不一致のケースでも、競合が報告される。 -下位モジュールで、下位バージョンの依存関係モジュールを使用 -上位モジュールで、上位バージョンの依存関係モジュールを使用 **調査方法 [#b7a12c2f] ***ビルド出力の詳細化 [#k4519d36] -ビルド出力のレベルを上げる。 --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)を使用 [#kd68313d] -以下からダウンロードできる。 --https://github.com/mikehadlow/AsmSpy --http://static.mikehadlow.com/AsmSpy.zip -以下のように使用する(net, netstd, netcore等で利用可能)。 AsmSpy C:\...\bin **対策方法 [#m1fe4578] ***依存アセンブリのバージョンを一致させる [#f57a223f] -この方法は、下位モジュールがNuGetパッケージだったりすると適用できない。 -このような場合、以下のバインディング リダイレクトの方法を適用する。 ***configファイルにバインディング リダイレクト セクションを追加する。 [#e7ce3b32] 以下のように、*.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ファイルに自動バインディング リダイレクトを設定する。 [#b4694b01] -手順 --(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" ノードに、次のバインド リダイレクトを追加します -参考 --有効にするか、自動生成されたバインド リダイレクトを無効にします。 | Microsoft Docs~ https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection ***[[.NET Core]]の場合 [#h22fa04f] -[[.NET Core]]には、バインディング リダイレクトが無い。 -特に、Microsoft.AspNetCore.App使用時などで、MSB3277が出るので、~ ログを確認し、問題を起こしているバージョン間の新しい方(若しくは最新版)~ のNuGetパッケージを上位プロジェクトから上書きインストールすれば良さそう。 -参考 --dependencies - Adding a bindingRedirect to a .Net Standard library - Stack Overflow~ https://stackoverflow.com/questions/46111749/adding-a-bindingredirect-to-a-net-standard-library *参考 [#m27af581] -警告 : 同じ依存アセンブリの異なるバージョン間での競合が見つかりました。~ https://msdn.microsoft.com/ja-jp/library/bb383993.aspx -警告:MSB3277が出た時の対処法メモ - Qiita~ https://qiita.com/hahifu/items/8dba20cd06fb0c3a9fa7 -.net - Resolving MSB3247 - Found conflicts between different versions of the same dependent assembly - Stack Overflow~ https://stackoverflow.com/questions/1871073/resolving-msb3247-found-conflicts-between-different-versions-of-the-same-depen -Code rant: AsmSpy: A little tool to help fix assembly version conflicts~ http://mikehadlow.blogspot.com/2011/02/asmspy-little-tool-to-help-fix-assembly.html ---- Tags: [[:.NET開発]], [[:デプロイ]], [[:デバッグ]], [[:NuGet]]