432

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

NDepend が役立つ場合もありますが、この場合、それ以上の詳細は示されませんでした。Bob のように、従属アセンブリの古いバージョンを参照しているアセンブリが見つかるまで、ILDASM で各アセンブリを開くことに頼らざるを得なくなりました。

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

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

4

16 に答える 16

585

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

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

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

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

私の特定のケースは、SqlServerCeへの誤った参照でした。下記参照。SqlServerCeの2つの異なるバージョンを参照する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.

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

  • 各レファレンスのプロパティを確認できます。
  • プロジェクトのプロパティを開き、[参照]セクションのバージョンを確認します。
  • テキストエディタでプロジェクトを開きます。
  • .NetReflectorを使用します。
于 2010-01-30T21:23:56.630 に答える
140

Mike 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 の原因を突き止めるためのはるかに迅速な方法です。

于 2012-03-30T20:35:18.927 に答える
24

@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... エラーメッセージを見つける

ビジュアル スタジオ 2013

于 2015-09-10T21:07:51.477 に答える
21

(少なくとも Visual Studio 2010 では) 問題を特定するには、出力の詳細度を少なくとも [詳細] に設定する必要があることがわかりました。

私の問題は、以前は GAC 参照であった参照であった可能性がありますが、マシンの再インストール後はそうではなくなりました。

于 2010-06-16T14:59:45.817 に答える
7

デフォルトのASP.NETMVC4ベータ版に対して生成されたこの警告は、 ここを参照してください

では、この警告のキャストは、プロジェクトの.csprojファイルを手動で編集することで排除できます。

変更........:参照Include = "System.Net.Http"

読むために......:参照Include = "System.Net.Http、Version = 4.0.0.0"

于 2012-04-25T09:02:45.560 に答える
6

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

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 を実行し、出力を 2 回パイプして awk に渡します。

  • 親と子を 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。次のいずれかを試してください

于 2016-01-06T15:49:15.893 に答える
4

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

犯人を見つけた後でも、問題は実際には非常に簡単でした。

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

バージョン 4.0.0.0 を指しているシステム参照のほとんどが判明しましたが、いくつかは自動的に変更されておらず (System および System.Web.Services)、まだ 2.0.0.0 を参照していました。Crystal レポートは 4.0.0.0 を参照しているため、ここで競合が発生していました。ソリューション エクスプローラーの最初のシステム ライブラリにカーソルを置き、リストの下にカーソルを置いて 2.0.0.0 への参照を探し、新しい 4.0.0.0 バージョンを削除して再度追加するだけでうまくいきました。

奇妙なことに、ほとんどの参照が正しく更新されていて、Crystal レポートがなければ、おそらく気付かなかったでしょう...

于 2010-11-02T17:15:31.047 に答える
2

Mike Hadlow アプリケーションに基づいてアプリケーションを作成しました: AsmSpy

私のアプリは GUI を備えた WPF アプリで、ホーム Web サーバーからダウンロードできます: AsmSpyPlus.exe

コードはGitHubで入手できます。

GUI サンプル

于 2015-08-18T18:44:19.657 に答える
2

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

于 2012-07-02T07:57:34.870 に答える
1

ASP.NET ビルド マネージャーは、フォルダーをアルファベット順に調べて Web サイトを構築しています。フォルダーごとに依存関係を特定し、最初に依存関係を構築し、次に選択したフォルダーを構築します。

この場合、~/Controls である問題のあるフォルダーが最初にビルドされるように選択されていますが、まだ不明な理由から、他のコントロールと同じアセンブリ内ではなく、別のアセンブリとしていくつかのコントロールをビルドします (一部のコントロールが同じフォルダー内の他のコントロールに依存しているという事実に関連している可能性があります)。

次に構築される次のフォルダー (~/File-Center/Control) は、~/Controls に依存するルート フォルダー ~/ に依存するため、フォルダー ~/Controls は今回のみ、分離されたコントロールのみを再構築します。独自のアセンブリへの結合は、他のコントロールと同じアセンブリに結合され、分離されたアセンブリは引き続き参照されます。

したがって、この時点で 2 つのアセンブリ (少なくとも) に同じコントロールがあり、ビルドは失敗します。

なぜこれが起こったのかはまだわかりませんが、Controls フォルダー名を ZControls に変更することで回避できました。あるべきように。

于 2011-04-29T21:05:01.253 に答える
0

(内部)依存関係を考慮しない最も簡単な方法:

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

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

于 2014-06-15T05:33:55.203 に答える