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


320

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

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

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

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


回答:


410

この警告は、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と同様に、すべてのプロジェクトで.Net 3.5バージョンのSystem.Windows.Formsが使用されます。

次に、問題のある参照を特定する方法をいくつか示します。

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

9
ユーティリティなしでそれを見つける簡単な方法の1つとして、(オプション2として)バインディングリダイレクトを追加すると、関連する参照が表示されます-必要に応じて、他の方法のいずれかを使用できますそれを処理し、設定リダイレクトからバインディングリダイレクトを削除します。
Brisbe

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

7
警告(ステップ2)をダブルクリックしてリダイレクトをバインドしても、警告は削除されません。原因と思われるアセンブリにapp.configが追加されているのが原因ですが、クリーンアップ/再構築後も警告が表示されます。さらにステップ3も試したが、うまくいかなかった。何か案は?
12

9
自分のプロジェクトからの参照でない場合はどうなりますか?たとえば、Newtonsoft.Json、Version = 6.0.0.0に依存するプロジェクトを参照し、Newtonsoft.Json、Version = 4.5.0.0に依存する別のプロジェクトを参照しました
Edward Ned Harvey

3
@ brian-low、リンクされたユーティリティと一緒に回答のオプションとしてビルド出力の詳細設定(@pauloyaのコメントで提案されている)を追加することを提案できますか?(免責事項、私は実際にそれを行うために答えを編集しようとしましたが、レビュー時に拒否されました:))
Rick Riensche

44

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

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

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

それが理にかなっていると思います!


31

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

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

たとえば、出力パネルで「conflict」を検索すると、次のようなものが見つかります。

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の間には競合があります。


3
しかし、この情報を入手したので、どうすればエラーを削除できますか?競合が何であるかはわかりますが、プロジェクトが競合しているバージョンを参照している場所がわかりません
Bassie

こんにちは@Bassie。最初にすることは、nugetパッケージファイルを確認し、すべてのファイルを同じバージョンのパッケージに更新する必要があるかどうかを判断することです。あなたは次のようにコマンドを実行することにより、これを行うことができupdate-package [your package name] -version 6.0.0 -reinstall、ここで私の答えどおりstackoverflow.com/questions/22685530/...
user1477388

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

@Bassieは私の答えを参照してください。ここで、不一致の問題を引き起こしているさまざまなアセンブリ/.dllを取得する方法を説明します。
newprint

22

私は自分のプロジェクトの1つで同じ問題を抱えていましたが、上記のいずれも警告の解決に役立ちませんでした。詳細なビルドログファイルを確認し、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ではビルド中に無視されているようです。
Thomas Weller

1
うわー、私はこれらの問題を2か月間抱えていて、それを特定して解決することができませんでした。何らかの理由で、デバッグ中にのみクラッシュし、場合によっては、煩わしい.dllが発生したときに手動でbinフォルダー内の実際の.dllに置き換えます。デバッグは本当に大変でした。私があなたの答えを読んだとき、私はこれがまさに私に起こっていたものであることに気づき、5分程度でそれを修正しました:)
Dennis Puzak

19

Visual Studioの上では、右クリックした場合ソリューションnugetパッケージ管理 theresの「統合」と同じバージョンにすべてのパッケージを設定]タブを。


先端をありがとう。今回は役に立ちませんでしたが、それがあることを知っておくのは良いことです。
BrainSlugs83

8

私はこの警告メッセージを受け取り、ソリューションをクリーンアップして再コンパイルし(ビルド->ソリューションのクリーンアップ)、それが消えました。


9
ただし、ソリューションを再構築するまでのみ
Luke

これは私を救います!昨日から他の解決策を試してきましたが、これで問題が解決しました。この上のコメントを含みます^。ありがとう!
vnpnlz 2016

6

私は同じ問題を抱えていましたが、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>

これが私の解決策でした。私は上位バージョンへのバインディングリダイレクトを持っていましたが、それは下位バージョンに移動したときにのみ機能しました。
mrwaim 2014年

1
どうして?私には奇妙です。EFは使用していませんが、常に最後のバージョンに移行したいと思っていましたか?
ホアンロング

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

3

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

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

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

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

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

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

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

  6. ソリューションレベルで、クリーンとリビルドを実行します。

下位のプロジェクトから始めて上位のプロジェクトに取り組み、各プロジェクトを進めながら再構築することもできます。

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


2

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

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

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


2

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

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

=>その後、クリーン、再構築、デプロイを試みます。

これは私の問題を解決しました。宜しくお願いします。


1

この問題もありました-私の場合、それはいくつかの参照の "Specific Version"プロパティがtrueに設定されていることが原因でした。これらの参照でこれをfalseに変更すると、問題が解決しました。


1

NuGetを使用している場合、私がしなければならないことは次のとおりです。

  1. プロジェクトを右クリックし、[NuGetパッケージの管理]をクリックします。

  2. 右上の歯車をクリックします

  3. パッケージソースの上にあるNuGetパッケージマネージャーの[全般]タブをクリックします。

  4. Binding Redirectsの「Skip Applying binding redirects」を確認してください

  5. クリーニングして再構築すると警告は消えます

イージーイージー


1

私はいつか同じ問題をデバッグするのに費やしました。この問題は異なるプロジェクト間ではなく、実際には同じDLL /アセンブリの異なるバージョンに依存する1つのプロジェクト内の複数の参照間の問題であることに注意してください。私の場合、問題はFastMember.dll、単一のプロジェクト内の2つの異なるNuGetパッケージからの参照バージョンの不一致でした。私にプロジェクトが与えられたとき、NuGetパッケージが欠落していて、VSが欠落しているパッケージの復元を拒否したため、プロジェクトはコンパイルされませんでした。NuGetメニューを使用して、すべてのNuGetを手動で最新バージョンに更新します。つまり、警告が表示されます。

Visual Studio で、ウィンドウ内のTools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.行を探します。以下は私が得た出力の一部です:There was a conflict betweenOutput

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

注意してください Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dllClosedXMLNuGet から来て、それはに依存しFastMember.dll 1.3.0.0ます。その上に、そこにもあるFastMemberNugetは、プロジェクトでは、それが持っています FastMember.dll 1.5.0.0。ミスマッチ!

バインドリダイレクトがあり、最新バージョンをインストールしたので、ClosedXMLFastMemberNuGets をアンインストールしました。ClosedXMLこれで問題が解決しました!


0

これも私に起こりました。1つのDLLが2回参照されました:1つは直接(参照で)、もう1つは間接的に(別の参照プロジェクトによって参照されています)。直接参照を削除し、ソリューションをクリーンアップして再構築しました。問題が修正されました。


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

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


0

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


0

Mac Visual Studioで.resxファイルを編集するときに問題があるようです。何が起こったのか本当にわかりませんが、Macでいくつかの.resxファイルを編集するとすぐにこの問題が発生しました。Windowsでプロジェクトを開き、ファイルを開いたところ、編集されていないかのように見えました。それで私はそれらを編集して保存し、Macでもすべてが再び機能し始めました。


0

プロジェクトにNETStandardLibraryへの参照があり、参照されているアセンブリの1つがnetcore用に公開されていると、このような問題が発生しました。ネットスタンダードとして公開し、問題は解消されました


0

これが.NET Core 3.0スタイルのソリューションです。 。https //github.com/HTD/ref-check

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

私の場合、競合するパッケージは多くの場合私自身のものなので、依存関係の問題を修正して再発行できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.