2008-08-20 197 views
284

現在20のプロジェクトで構成される.NETアプリケーションを開発中です。それらのプロジェクトのいくつかは.NET 3.5を使用してコンパイルされ、他のいくつかはまだ.NET 2.0プロジェクトです(これまでのところ問題ありません)。 #pragma無効を使用してのように、この警告を(排除する可能性、この警告が正確に警告:同じ依存アセンブリの異なるバージョン間で競合が見つかりました

"Found conflicts between different versions of the same dependent assembly". 

何を意味し、多分そこにある:

問題は、私は外付け部品が含まれている場合、私はいつも次の警告を得ることですソースコードファイルに)?

+0

[MSB3247の解決 - 同じ依存アセンブリの異なるバージョン間で競合が見つかりました](http://stackoverflow.com/questions/1871073/resolving-msb3247-found-conflicts)同じバージョンの異なるバージョン間) –

答えて

373

この警告は、2つのプロジェクトが同じアセンブリ(たとえばSystem.Windows.Forms)を参照しているが、2つのプロジェクトが異なるバージョンを必要とすることを意味します。いくつかのオプションがあります:

  1. すべてのプロジェクトが同じバージョンを使用するように再コンパイルします(たとえば、.Net 3.5にすべて移動します)。これは、すべてのコードがコンパイルされた依存性のバージョンで実行されているため、これが好ましいオプションです。

  2. binding redirectを追加します。これにより、警告が抑制されます。ただし、.Net 2.0プロジェクトは(実行時に)System.Windows.Formsなどの依存するアセンブリの.Net 3.5バージョンにバインドされます。 Visual Studioでエラーをダブルクリックすると、バインドリダイレクトをすばやく追加できます。

  3. CopyLocal=trueを使用してください。これが警告を抑制するかどうかはわかりません。上記のオプション2と同様に、すべてのプロジェクトで.Net 3.5バージョンのSystem.Windows.Formsを使用することになります。ここで

は、問題の参照(複数可)を識別するための方法のカップルです:

  • あなたは、そのような別の簡単な方法を設定することです https://gist.github.com/1553265
  • で見られるものなどのユーティリティを使用することができます 出力の冗長性(ツール、オプション、プロジェクト、ソリューション、ビルド、 実行、MSBuildプロジェクトのビルド出力詳細、詳細)、 ビルド後、出力ウィンドウでワーニングを検索し、 テキストのすぐ上に表示されます。 (この回答に のコメントでこれを示唆した帽子の先端はpauloyaです)
+2

+1ここのリンクも同様です。すぐに私の問題を解決しました。 – bic

+8

ユーティリティを使わずに簡単に見つけられるのは、バインディングリダイレクト(オプション2として)を追加すると関連する参照が表示されます。必要に応じて他のそれを処理し、設定ファイルからバインディングリダイレクトを削除する方法について説明します。 – Brisbe42

+191

"害のある参照"を見つける最も簡単な方法は、ビルド出力の冗長性(ツール、オプション、プロジェクトとソリューション、ビルドと実行、MSBuildプロジェクトのビルド出力の冗長性、詳細)を設定し、ビルド後に出力を検索することです警告のためのウィンドウ。その真上のテキストを参照してください。 – pauloya

39

基本的には、参照しているアセンブリに "ローカルコピー"が "True"に設定されている場合に発生します。つまり、DLLのコピーがEXEと共にビンフォルダに配置されます。

Visual Studioは、参照アセンブリのすべての依存関係もコピーするので、同じアセンブリの2つの異なるビルドが参照される可能性があります。これは、プロジェクトが別々のソリューションにある場合に発生する可能性が高く、個別にコンパイルすることができます。

私が取り組んだのは、アセンブリプロジェクトでの参照のためにローカルコピーを偽に設定することです。完成した製品を実行するアセンブリが必要な実行可能ファイル/ Webアプリケーションでのみ実行します。

希望は意味があります!

2

これは実際に外部コンポーネントによって異なります。 .NETアプリケーションで外部コンポーネントを参照すると、そのコンポーネントを識別するためのGUIDが生成されます。このエラーは、プロジェクトのいずれかで参照されている外部コンポーネントの名前が同じで、別のアセンブリの別のコンポーネントとバージョンが異なる場合に発生します。

「参照」を使用して参照を見つけて間違ったバージョンのアセンブリを追加したり、ローカルマシンにインストールしたものとは異なるコードバージョンのコンポーネントがコードリポジトリにあると、

これらの競合が発生しているプロジェクトを見つけて、参照リストからコンポーネントを削除してから再度追加して、同じファイルを指していることを確認してください。

6

この警告メッセージが表示され、ソリューションがクリーンアップされ、再コンパイルされて(ビルド - >クリーンソリューション)、遠ざかりました。

+7

解決策を再構築するまでは – Luke

+0

ですが、これは私を助けます!私は昨日から他の解決策を試してきましたが、この1つは私の問題を解決しました。上記のコメントを含む^。ありがとう! – vnpnlz

+0

すごい!それはまた私の問題を解決しました – code4j

16

私は自分のプロジェクトで同じ問題を抱えていましたが、警告を解決するのに役立つものはありませんでした。詳細なビルドログファイルを確認し、AsmSpyを使用して影響を受けるソリューションの各プロジェクトに正しいバージョンを使用していることを確認し、各プロジェクトファイルの実際のエントリをダブルチェックしました。

結局のところ、問題は1つのプロジェクトで持っていた参照のうちの1つのネストされた依存性であることが判明しました。このリファレンス(A)には、(B)の別のバージョンが必要でしたが、これは私のソリューション内の他のすべてのプロジェクトから直接参照されていました。参照されたプロジェクトの参照を更新すると、それが解決されました。

私は上記の私が何を意味するかを示し願ってい
Solution A 
+--Project A 
    +--Reference A (version 1.1.0.0) 
    +--Reference B 
+--Project B 
    +--Reference A (version 1.1.0.0) 
    +--Reference B 
    +--Reference C 
+--Project C 
    +--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0) 

Solution B 
+--Project A 
    +--Reference A (version 1.1.1.0) 

は、見つけるために時間の私のカップルを取ったので、うまくいけば他の誰かにも利益になります。

+1

同じ問題がここにあります。しかし、私は新しいバージョンへの参照を更新する機会がありません。私はApp.configを使ってみました:それはアプリケーションのために働く一方で、Visual Studio 2010はビルド中にそれを無視するようです。 –

+0

+1ネストされた依存関係の場合。 –

+1

うわー、私は2ヶ月間これらの問題を抱えていて、それを特定して解決できませんでした。何らかの理由でデバッグ中にクラッシュし、場合によっては、厄介な.dllをbinフォルダの実際のものと手動で置き換えることがあります。デバッグは本当に苦痛でした。私はあなたの答えを読むとき、私はこれがまさに私に起こっていたことを実感し、私は5分のようにそれを修正しました:) –

0

これは私にも起こりました。 1つのdllは2回参照されました。ひとつは直接参照(参照)と間接(別の参照プロジェクト参照)です。 直接参照を削除しました。クリーニング済みの&リビルド済みソリューションを削除しました。問題は修正されました。

2

Nugetを使用して依存関係を管理している場合、これを行う別の方法があります。 VSとNugetが一致しないことがあり、Nugetがあなたのプロジェクトが同期していないことを認識できないことを発見しました。 packages.configは1つのことを示しますが、References - Propertiesに表示されているパスは他のものを示します。

あなたの依存関係を更新するために喜んでいる場合は、次の手順を実行します。

  1. ソリューションエクスプローラから、プロジェクトを右クリックし、[管理 Nugetパッケージ「

  2. をクリックして「インストールされたパッケージを選択します'タブインストール済みの パッケージを記録するパッケージがたくさんある場合は、まず デスクトップにpackages.configをコピーすることができます。 Googleとクロスチェックして、インストールされているNugetパッケージを確認することができます

  3. パッケージをアンインストールします。 OK、すぐに追加します。

  4. すぐに必要なパッケージをインストールしてください。Nugetが行うことは、あなたに最新のバージョンを提供するだけでなく、あなたの参照を変更し、あなたのためのバインディングリダイレクトを追加することです。

  5. は、すべてのプロジェクトのためにこれを行います。ソリューションレベルで

  6. 、クリーンを行い、再構築します。

より低いプロジェクトから始め、より高いレベルのものに向かい、それぞれのプロジェクトを再構築することができます。

あなたの依存関係を更新したくない場合は、あなたがパッケージマネージャコンソールを使用して、構文のアップデート・パッケージ-ProjectName [yourProjectName] [のpackageName] -Version [のversionNumber]

0
  1. を使用することができます「ソリューションエクスプローラ」を開きます。
  2. 「すべてのファイルを表示」をクリックし
  3. は「参考文献」
  4. を展開してあなたは残りの部分よりもわずかに異なるアイコンで1つ(またはそれ以上)の参照(複数可)を参照してくださいよ。通常、黄色いボックスが表示されています。ただそれを削除します。
  5. リファレンスを追加してコードをコンパイルします。
  6. それだけです。私の場合は

、MySQLの参照に問題がありました。どういうわけか、利用可能なすべての参考文献のリストの下に3つのバージョンをリストアップすることができました。 .net 2.0、.net 4.0、.net 4.5の場合私は上記のプロセス1から6を踏襲し、それは私のために働いた。

6

私は同じ問題がありましたが、web.configで次のように変更して解決しました。

<dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> 
</dependentAssembly> 

::私はよりNewtonsoft.Json 4.0

を使用してアプリケーションを実行していますので、それは私に起こった

<dependentAssembly> 
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" /> 
</dependentAssembly> 
+0

これは私のための解決策でした。私はより高いバージョンへの拘束力のあるリダイレクトを持っていました。 – mrwaim

+1

なぜですか?だから私のために奇妙。私はEFを使用しませんが、私はいつも最後のバージョンに移行したいと思っていましたか? –

+1

@HoàngLongあなたが参照しているバージョンは古いバージョンですが、含まれているバージョンは新しいバージョンです。 – BrainSlugs83

1

はまた、この問題を持っていた - 私の場合、それには複数の参照の "Specific Version"プロパティをtrueに設定することによって発生しました。これらの参照でこれをfalseに変更すると、問題が解決しました。

25

私は上記のコメントで提供したpauloyaのソリューションを投稿したかったのです。私はそれが問題の参照を見つけるための最善の解決策だと信じています。

「問題の参照(複数可)、」あるものを見つけるための最も簡単な方法は、出力の冗長性(ツール、オプション、プロジェクトおよびソリューション、 ビルドして実行、のMSBuildプロジェクトのビルド出力の冗長性、詳細)を作成 セットにありますビルド後に を実行すると、警告の出力ウィンドウが検索されます。そのすぐ上にあるテキスト を参照してください。

3> There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089". 
3>  "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not. 

あなたが見ることができるように、EFのバージョン5と6

の間に矛盾がある:あなたが「紛争」のために、出力パネルを検索するとき例えば

、あなたはこのような何かを見つけることができますVisual Studioのオン

+0

しかし、私はこの情報を持っているので、どのようにエラーを取り除くのですか?私は競合が何かを見ることができますが、プロジェクトが相反するバージョン – Bassie

+0

を参照している場所を見つけることができませんHi @Bassie、まず、あなたのナゲットパッケージファイルをチェックし、すべてのファイルを同じバージョンのパッケージ。これを行うには、私の答えに応じて 'update-package [あなたのパッケージ名] -version 6.0.0 -reinstall'コマンドを実行してください。http://stackoverflow.com/questions/22685530/could-not-load- file-or-assembly-newtonsoft-json-or-its-dependencies-ma/26891914#26891914 – user1477388

+0

@Bassie、あなたは警告が示していることを実行し、app.configファイルにバインディングリダイレクトを追加できます! (更新がオプションでない場合、それはです。) – BrainSlugs83

6

あなたが右nugetパッケージをソリューションをクリックすると管理する場合は、SAMにすべてのパッケージを設定します「統合」タブをtheresの電子版。

+0

チップをありがとう。今回は私を助けませんでしたが、それがあることを知っているのは良いことです。 – BrainSlugs83

2

=>一部のアプリケーションが一部インストールされていることを確認します。

=>最初にアンインストールアプリケーションからそのインスタンスをアンインストールします。

=>その後、クリーンアップして再構築して展開してください。

これが私のissue.hopeを解決しました。 よろしくおねがいします。

0

もうひとつ検討したいことは、そのbinフォルダを使用しているサービスが実行されていないことを確認することです。サービスを停止してソリューションを再構築する場合

関連する問題