.net - 警告:同じ依存アセンブリの異なるバージョン間で競合が見つかりました


私は現在、20のプロジェクトで構成される.NETアプリケーションを開発中です。 これらのプロジェクトのいくつかは.NET 3.5を使用してコンパイルされ、他のいくつかはまだ.NET 2.0プロジェクトです(これまでのところ問題ありません)。

問題は、私が外部コンポーネントを組み込むと、私は常に以下の警告を得ることです:

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

この警告は正確に何を意味し、この警告を除外する可能性がありますか(ソースコードファイルで#pragma disableを使用するなど)?



Answers



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

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

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

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

問題のある参照を特定するユーティリティを次に示します。

https://gist.github.com/1553265




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

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

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

希望は意味をなさない!




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

"不快な参照"を見つける最も簡単な方法は、ビルド出力の詳細な設定(ツール、オプション、プロジェクトとソリューション、ビルドと実行、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の間には矛盾があります。




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

結局のところ、問題は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)

私は上記のことが私の言うことを示すことを願って、調べるために私の数時間を要したので、他の誰かが同様に恩恵を受けることを願っています。




私はちょうどこの警告メッセージを持って、ソリューションをきれいにして再コンパイルしました(ビルド - >クリーンソリューション)とそれは遠ざかりました。




私は同じ問題を抱えていて、web.configで次のように変更して解決しました。

Newtonsoft.Json 4.0を使用してアプリケーションを実行しているので、私に起こった

から:

<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>

に:

<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>



Visual Studioの場合、 ソリューションを右クリックし、 Manage nuget packagesは、すべてのパッケージを同じバージョンに設定する「Consolidate」タブを表示します。




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

これは、「参照」を使用して参照を検索し、誤ったバージョンのアセンブリを追加するか、ローカルマシンにインストールしたコンポーネントとは異なるコードバージョンのコンポーネントをコードリポジトリに追加すると発生することがあります。

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




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

依存関係を更新する場合は、次のようにします。

  1. ソリューションエクスプローラから、プロジェクトを右クリックし、[Manage Nuget Packages]をクリックします。

  2. 左側のペインの「インストールされたパッケージ」タブを選択インストールされているパッケージを記録するパッケージがたくさんある場合はまずパッケージにコピーすることができますので、GoogleとクロスチェックしてインストールされているNugetパッケージを確認してください

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

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

  5. すべてのプロジェクトでこれを行います。

  6. 解決策レベルで、クリーンと再構築を行います。

下位のプロジェクトから始め、上位のものに向かい、それぞれのプロジェクトを再構築することができます。

依存関係を更新しない場合は、パッケージマネージャコンソールを使用して、Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber]の構文を使用して、




また、この問題を抱えていました。私の場合は、多数の参照の「特定のバージョン」プロパティをtrueに設定することによって発生しました。 これらの参照でこれをfalseに変更すると、問題が解決しました。




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

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

=>次に、クリーンアップ、再構築、デプロイを試してください。

これは私の問題を解決しました。それはあなたにも役立ちます。 宜しくお願いします。




これも私に起こった。 1つのdllが2回参照されました.1回は直接参照で、もう1回は間接的に参照されました。 私は直接参照を削除し、きれいに&再構築されたソリューション。 問題は修正されました。




  1. 「ソリューションエクスプローラ」を開きます。
  2. [すべてのファイルを表示]をクリックします。
  3. 「参照」を展開する
  4. 残りのアイコンとは少し異なるアイコンを含む1つ(または複数)の参照が表示されます。 通常、黄色いボックスが表示されています。 ただそれを削除します。
  5. 参照を追加し、コードをコンパイルします。
  6. それで全部です。

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




考慮すべきもう1つのことは、binフォルダーを使用しているサービスを実行していないことを確認することです。 彼らがサービスを停止し、ソリューションを再構築する場合