私は10個のプロジェクトを持つソリューションを持っています。多くのプロジェクトは、サードパーティの DLL に依存していますfoo.dll
。
問題は、foo をアップグレードすると、どういうわけか Visual Studio でオブジェクト ブラウザに移動すると、2 つのバージョンのfoo.dll
.
古いバージョンの foo.dll を参照しているプロジェクトを見つけて、すべてのプロジェクトで依存関係が 1 つだけになるようにアップグレードするにはどうすればよいですか?
私は10個のプロジェクトを持つソリューションを持っています。多くのプロジェクトは、サードパーティの DLL に依存していますfoo.dll
。
問題は、foo をアップグレードすると、どういうわけか Visual Studio でオブジェクト ブラウザに移動すると、2 つのバージョンのfoo.dll
.
古いバージョンの foo.dll を参照しているプロジェクトを見つけて、すべてのプロジェクトで依存関係が 1 つだけになるようにアップグレードするにはどうすればよいですか?
これは、一度だけやりたいことです。
あなたへの私のお勧めは、メモ帳を入手することです。はい、メモ帳です。
各プロジェクトの .csproj ファイルを開きます。
XML には、パスなどを含む、参照されている DLL の概要を説明するセクションがあります。それらが GAC から出ている場合でも、.NET リンカによって使用されるバージョンなどがファイルに含まれます。 . 参照への行全体が正確に一致する必要があります。
これらを、正しいとわかっている 1 つのプロジェクトと比較してください。
.NET で参照を処理することは、.NET の最悪の部分の 1 つです。DLL地獄v2.0へようこそ:(
最善の答えは、可能な場合、この依存関係を持つプロジェクトを 1 つだけにすることだと思います。1 か所で処理できます。
これが、プロジェクトが DLL の周りに途方もなく太いラッパー ライブラリで構成される必要があることを意味する場合、これは最善の方法ではない可能性があります。しかし、少なくともそれを考慮してください。
私はこれと同じ問題を抱えていました。
プロジェクト A はプロジェクト B を参照しました。プロジェクト C はプロジェクト B を参照したプロジェクト D を参照しました。これにより、プロジェクト C がプロジェクト B を参照するようになりました。プロジェクト D を削除し、プロジェクト C を (コード内で) クリーンアップしましたが、プロジェクト B は残りました。プロジェクト D の bin フォルダーを指すバイナリ参照として推測します。
Visual Studio 内のプロジェクト B を更新しました。スタートアップ Project C として実行すると、このエラーがスローされました。
修正するために、プロジェクト C の参照に進み、未使用の参照を削除しました。
ところで、あなたの実際の質問 - 問題のある dll がどこにあるのかを見つける方法 - は、次のように簡単に答えることができます: . 2. エクスプローラーで FileVersion の列を追加し、この列で並べ替えます。出来上がり!
GAC に両方のバージョンの Foo.dll がインストールされているようです。古いものを削除するには、gacutilをチェックしてください。
単なるファイル参照の場合は、各プロジェクトで「参照」を開き、「Foo」を右クリックしてプロパティを選択します。結果のプロパティウィンドウに、バージョンなどの情報が表示されます。
通常、このような依存関係への最善のアプローチは、プロジェクト レベル (ただし、実際のソリューションの一部ではない) に、これらの種類の DLL を含む「依存関係」と呼ばれる別のフォルダーを用意することです。
また、ビルドの前にアセンブリの正しいバージョンを bin フォルダーにコピーする、サーバー上のビルド自動化 (TFS = チーム ビルド、SVN = クルーズ コントロールなど) も検討します。
アセンブリにはさまざまな方法があり、さまざまなアプリケーションでどのアセンブリが使用されているか混乱しがちです。将来のすべてのプロジェクトに適用できるテンプレート化可能な方法で、この問題を一度解決するのに時間を費やす価値があります。
問題は理解できましたが、質問の仕方が正しいかどうかわかりません。.NET が参照アセンブリを選択する方法を説明しましょう。
アセンブリ参照は、フローティングまたは固定できます (プロジェクトの参照フォルダーでアセンブリを右クリックし、[プロパティ] を選択して、[特定のバージョン] を探します)。バージョンが変動している場合、.NET は最新のものを見つけて使用します。説明した問題を回避できるように、参照のバージョンを「固定」することは理にかなっています (つまり、製品の新しいバージョンをインストールしてもアプリケーションが壊れることはありません)。
アセンブリは、グローバル アセンブリ キャッシュに置くことも、ファイル システムに置くこともできます。1 つのアプローチを選択し、それをプロジェクト全体で一貫して使用する必要があります。これにより、少なくともどこを見ればよいかがわかります。
この 2 つの側面を理解していれば、問題は発生しないはずです (少なくとも、問題が発生した場合の対処方法を知っておく必要があります)。バージョンを固定してアップグレードする場合は、10 個の何かのプロジェクトを開いて参照をアップグレードする必要がありますが、偶発的なアップグレードから隔離されます。
バージョンをフロートさせると、すべての参照がインストールされている最新バージョンを自動的に取得します。アセンブリを GAC に配置すると、DLL ファイルの残りの部分や偶発的なコピーを検索パスとファイル システムで検索する必要がなくなります。