MSB3247 の解決 - 同じ依存アセンブリの異なるバージョン間で競合が見つかった

StackOverflow https://stackoverflow.com/questions/1871073

  •  18-09-2019
  •  | 
  •  

質問

.NET 3.5 ソリューションでは、msbuild でコンパイルするとこの警告が表示されました。

NDepend が役立つ場合もありますが、この場合はそれ以上の詳細は提供されませんでした。 ボブのように 結局、古いバージョンの依存アセンブリを参照しているアセンブリが見つかるまで、ILDASM で各アセンブリを開く必要がありました。

VS 2010 Beta 2のMSBUILDを使用してみました(Connectの記事で、これはCLRの次のバージョンで修正されたことが示されているため)が、それ以上の詳細は提供されませんでした(おそらくBeta 2後に修正された)

もっと良い (より自動化された) アプローチはありますか?

役に立ちましたか?

解決

「MSBuild プロジェクトのビルド出力の詳細度」を「詳細」以上に変更します。これを行うには、次の手順に従います。

  1. [オプション]ダイアログを表示します(ツール -> オプション...).
  2. 左側のツリーで、 プロジェクトとソリューション ノードを選択し、 構築して実行する.
    • 注記:このノードが表示されない場合は、ダイアログの下部にあるチェックボックスがオンになっていることを確認してください。 すべての設定を表示 にチェックが入っています。
  3. 表示されるツール/オプション ページで、 MSBuild プロジェクトのビルド出力の冗長性 バージョンに応じてレベルを適切な設定に変更します。

  4. プロジェクトをビルドし、出力ウィンドウを確認します。

MSBuild メッセージを確認してください。の ResolveAssemblyReferences MSB3247 の元のタスクであるタスクは、この特定の問題のデバッグに役立ちます。

私の具体的なケースは、SqlServerCe への誤った参照でした。以下を参照してください。2 つの異なるバージョンの SqlServerCe を参照する 2 つのプロジェクトがありました。古いバージョンのプロジェクトに移動し、参照を削除してから、正しい参照を追加しました。

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

参照されているアセンブリのバージョンを確認するために各アセンブリを開く必要はありません。

  • 各参照のプロパティを確認できます。
  • プロジェクトのプロパティを開き、「参照」セクションのバージョンを確認します。
  • テキスト エディタでプロジェクトを開きます。
  • .Netリフレクターを使用します。

他のヒント

マイクHadlowのは投稿しましたそのこのAsmSpyと呼ばれる小さなコンソールアプリケーションではなく、うまく各アセンブリの参照を一覧表示します:

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

これは、MSBuildの出力に依存するよりも、警告MSB3247の底に取得するにははるかに高速な方法です。

@AMissico の回答では十分ではない場合があります。私の場合、出力ウィンドウでエラーを見つけることができなかったので、次の手順を実行してログ ファイルを作成し、分析することにしました。

  1. ビルド ログをファイルに保存しています... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. テキストを見つけます: warning MS... または特定の警告情報:(例えば。9293行目) Found conflicts between different versions... 競合エラーの詳細はこのメッセージの上にあります (例:9277行目) There was a conflicts between... Find the error message

Visual Studio 2013

私はあなたへの出力の冗長性を設定する必要があります(少なくとも2010のVisual Studioで)少なくとも詳細な問題を発見できるようにすることがわかっています。

これは私の問題は、以前にGAC参照したリファレンスませんでしたが、それは私のマシンの再インストールした後、もはやそうであったということかもしれません。

この警告はデフォルトASP.NET MVC 4ベータ版のために生成しました ここを参照してくださいする

  

は、この警告を手動で編集することによって除去することができる任意のキャスト   プロジェクトの.csprojファイルます。

     

変更........:リファレンス含める= "System.Net.Http"

     

......読むため:リファレンス含める= "System.Net.Http、バージョン= 4.0.0.0"

同じエラーが発生しましたが、他の回答ではそれを理解できませんでした。NuGet パッケージを「統合」できることがわかりました。

  1. ソリューションを右クリックします
  2. 「Nuget パッケージの管理」をクリックします
  3. タブを統合し、同じバージョンに更新します。

依存関係リーダーを使用する

使用する dep.exe フォルダー全体のネストされた依存関係をすべてリストすることができます。grep や awk などの UNIX ツールと組み合わせると、問題の解決に役立ちます

複数のバージョンで参照されているアセンブリの検索

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

このわかりにくいコマンド ラインは dep.exe を実行し、出力を awk に 2 回パイプします。

  • 親と子を 1 つの列に配置します (デフォルトでは、この親がその子に依存するという事実を表すために、各行に 1 つの親と 1 つの子が含まれます)
  • 次に、連想配列を使用して一種の「グループ化」を実行します

このアセンブリがどのようにしてビンに取り込まれたのかを理解する

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

この例では、ツールは System.Web.Http 5.2.3 が FooLib への依存関係に由来するのに対し、バージョン 4.0.0 は BarLib に由来することを示します。

次に、次のいずれかを選択します。

  • ライブラリの所有者に同じバージョンを使用するよう説得する
  • それらを使用するのをやめてください
  • 最新バージョンを使用するには、構成ファイルにバインディング リダイレクトを追加します。

これらを Windows で実行する方法

Unix タイプのシェルがない場合は、実行する前にシェルをダウンロードする必要があります awkそして grep. 。次のいずれかを試してください

私もこの問題を抱えていたし、詳細に冗長レベルを設定する必要がありましたが、AMissicoのアドバイスがあまりにも(問題を発見使用します。

問題が犯人を見つけた後かかわらず、非常にまっすぐ進む実際ました。

背景: 私はVS2008からVS2010に自分のプロジェクトをアップグレードしました。 VS2008でターゲットフレームワークは3.5だったと私はVS2010にそれを持ってきたとき、私は(フル)4にそれを切り替えます。私はまた、Crystalレポートを含むいくつかのサードパーティのコンポーネントをアップグレードします。

これは、バージョン4.0.0.0を指しますがカップルが自動的に(システムとSystem.Web.Services)に変更されていなかったし、まだ2.0.0.0を見ていたシステムの参照のほとんどが判明しました。 Crystalレポートは、4.0.0.0を参照していると、競合がoccuringたところこれはでした。単純に削除し、4.0.0.0バージョンはトリックをした新しい再追加し、カーソルダウンリストを、ソリューションエクスプローラで最初のシステムライブラリにカーソルを置くと、2.0.0.0への参照を探しています。

この奇妙なは参照のほとんどが正しく更新されていたことだったし、それがなかったらCrystalレポートのために、私はおそらく...気づかなかっただろう。

私は<のhref = "http://mikehadlow.blogspot.ca/2011/02/asmspy-little-tool-to-help-fix-assembly.html" のrel = "nofollowをnoreferrer" に基づいてアプリケーションを作りました>マイクHadlowのアプリケーション:AsmSpyする。

私のアプリでは、GUIを持つWPFのアプリで、私の自宅のウェブサーバからダウンロードすることができます: AsmSpyPlus。 exeファイルのます。

コードで提供されています: GitHubの

で述べたようにここには、未使用の参照を削除する必要があるとの警告が入ります。

ASP.NETのビルドマネージャはアルファベット順にフォルダを経てウェブサイトを構築されており、フォルダごとにそれが選択したフォルダ最初にして、依存関係を依存関係とビルドを割り出します。

この場合〜/制御する問題のフォルダが、それは別のアセンブリとしての代わりに、他のコントロールと同じアセンブリの内部に存在コントロールの一部を構築し、未知の理由から、最初に構築されるように選択されます(いくつかのコントロールは、同じフォルダ内の他のコントロールに依存しているという事実に接続しているようだ)。

そして、構築されている次のフォルダ(〜/ファイル・センター/コントロール)〜/コントロールに依存しているルートフォルダ〜/に依存しているので、フォルダ〜/コントロールは再びこれだけ時間が建設されているコントロール独自のアセンブリに分離された今、まだ参照されて分離アセンブリと他のコントロールと同じアセンブリに接合されている。

この時点でSO 2アセンブリ(少なくとも)は、同じコントロールを持っていると、ビルドは失敗します。

これはなぜ起こったか、我々はまだわかりませんが、

、我々は後にのみ、それは〜/ファイル・センター/コントロールの前に内蔵されていませんこのようZControlsへのコントロールのフォルダ名を変更することにより、それを回避することができましたし、このようそれはそれが必要として構築されています。

クイックフィックス:

ソリューションを右クリック -> ソリューションの NuGet パッケージを管理 -> の下 統合する 同じパッケージの異なるバージョンがインストールされているかどうかを確認できます。異なるバージョンをアンインストールし、最新のものをインストールします。

時々AutoGenerateBindingRedirectsは(でも GenerateBindingRedirectsOutputTypeするで)十分ではありません。すべてThere was a conflictエントリを検索し、一つ一つが退屈することができ、それらを手動で固定したので、私は、ログ出力を解析し、あなたのためにそれらを生成するコードの小片(stdoutするダンプを)書いてます:

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

ヒント:使用 MSBuildのバイナリおよび構造化されたログビューアとだけが発するプロジェクトにおける紛争のための結合リダイレクトを生成します警告(すなわち、[there was a conflict]上記コードの入力テキストファイルにのみAssemblyConflicts.txt線を過ぎ、である)。

(内部) 依存関係を考慮せずに最も簡単な方法:

  1. 「ソリューションエクスプローラー」を開きます。
  2. 「すべてのファイルを表示」をクリックします
  3. 「参考文献」を展開します
  4. 残りとはわずかに異なるアイコンを持つ 1 つ (または複数) のリファレンスが表示されます。通常、メモを取ることを示唆する黄色のボックスが表示されます。取り外してください。
  5. 参照を再度追加し、コードをコンパイルします。
  6. それだけです。

私の場合、MySQL 参照に問題がありました。どういうわけか、入手可能なすべての参考文献のリストの下に、このバージョンの 3 つのバージョンをリストすることができました。上記のプロセス 1 ~ 6 を実行したところ、うまくいきました。

マックコミュニティほかのVisual Studio:

AMissicoの答えには、ログレベルを変更する必要があり、かつASMSpyもASMSpyPlusでもないが、クロスプラットフォームソリューションとして用意されていたようここではMac用のVisual Studioの短い追加があります:

  

https://docs.microsoft.com/en -us / VisualStudioを/ MAC /コンパイル-および構築する

これはをVisual Studioのコミュニティの→設定...→プロジェクトに→ログイン→冗長

を構築しています
あなたはReSharperのを持っている場合は、

、あなたのソリューションのすべての未使用の参照を削除します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top