344

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

問題は、外部コンポーネントを含めると、常に次の警告が表示されることです。

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

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

4

20 に答える 20

435

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

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

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

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

問題のある参照を特定するには、次の 2 つの方法があります。

  • https://gist.github.com/1553265にあるようなユーティリティを使用でき ます
  • もう 1 つの簡単な方法は、ビルド出力の詳細度 ([ツール]、[オプション]、[プロジェクトとソリューション]、[ビルドと実行]、[MSBuild プロジェクト ビルド出力の詳細度]、[詳細]) を設定し、ビルド後に出力ウィンドウで警告を検索し、そのすぐ上のテキストを確認することです。 . (この回答のコメントでこれを提案したパウロヤへの帽子のヒント) 。
于 2010-01-26T05:54:29.003 に答える
45

基本的に、これは、参照しているアセンブリの「ローカルコピー」が「True」に設定されている場合に発生します。これは、DLLのコピーがexeとともにbinフォルダーに配置されることを意味します。

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

私がそれを回避する方法は、アセンブリプロジェクトで参照するためにローカルコピーをFalseに設定することです。完成品を実行するためのアセンブリが必要な実行可能ファイル/Webアプリケーションに対してのみ実行してください。

それが理にかなっていることを願っています!

于 2008-08-20T12:08:05.457 に答える
34

上記のコメントで提供されたパウロヤのソリューションを投稿したかったのです。問題のある参照を見つけるための最良の解決策だと思います。

「問題のある参照」を見つける最も簡単な方法は、ビルド出力の詳細度 ([ツール]、[オプション]、[プロジェクトとソリューション]、[ビルドと実行]、[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 の間に競合があります。

于 2015-11-10T15:18:50.827 に答える
23

私のプロジェクトの 1 つで同じ問題が発生しましたが、上記のいずれも警告を解決するのに役立ちませんでした。詳細なビルド ログ ファイルを確認し、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)

上記が私の言いたいことを示していることを願っています。見つけるのに数時間かかりました。うまくいけば、他の誰かも恩恵を受けるでしょう.

于 2012-11-09T16:44:13.373 に答える
9

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

于 2012-01-16T22:50:11.943 に答える
3

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

依存関係を更新する場合は、次の手順を実行します。

  1. ソリューション エクスプローラーでプロジェクトを右クリックし、[Nuget パッケージの管理] をクリックします。

  2. 左側のペインで [インストール済みパッケージ] タブを選択します インストール済みパッケージを記録します パッケージがたくさんある場合は、最初に packages.config をデスクトップにコピーすることをお勧めします。これにより、Google とクロスチェックして、どの Nuget pkgs がインストールされているかを確認できます。

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

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

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

  6. ソリューション レベルで、Clean and Rebuild を実行します。

下位のプロジェクトから始めて、上位レベルのプロジェクトに向かって作業を進め、進むにつれて各プロジェクトを再構築することをお勧めします。

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

于 2014-04-09T00:48:34.947 に答える
2

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

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

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

于 2008-08-20T12:11:30.847 に答える
1

この問題もありました-私の場合、多くの参照の「特定のバージョン」プロパティがtrueに設定されていることが原因でした。これらの参照でこれを false に変更すると、問題が解決しました。

于 2014-11-20T02:47:05.597 に答える
0

.NET Core 3.0 スタイルのソリューション: https://github.com/HTD/ref-check

競合が見つかった場合、競合を解決できる可能性があります。競合する参照が他のパッケージからのものである場合は、運が悪いか、代わりにソースを使用する必要があります。

私の場合、競合するパッケージは多くの場合自分のものであるため、依存関係の問題を修正して再公開できます。

于 2019-09-26T20:58:52.777 に答える
0
  1. 「ソリューション エクスプローラー」を開きます。
  2. 「すべてのファイルを表示」をクリック
  3. 「参照」を展開
  4. 1 つ (または複数) の参照が、残りのアイコンとは少し異なるアイコンで表示されます。通常、メモを取るように提案する黄色のボックスが付いています。取り除くだけです。
  5. 参照を追加し直して、コードをコンパイルします。
  6. それで全部です。

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

于 2014-06-15T05:25:44.877 に答える