web-dev-qa-db-ja.com

2つのDLLが競合して、ビルドするソリューションが妨げられる可能性はありますか

特定のケースがありますが、一般的な状況について疑問に思いました。

2つのDLLをVisual C#プロジェクトへの参照として追加すると、ソリューションが構築されないように互いに衝突する可能性がありますか?これが事実である場合、これを軽減する可能な方法は何ですか。

9
Shamim Hafiz

これは非常に可能です。

異なるアセンブリ(またはプロジェクトと追加されたアセンブリ)で同じ名前空間と型名を定義した場合、これらの型のいずれかを使用しようとするコードとの競合が発生します。

参照と同様に、一意の名前空間があることを確認すると、この問題は発生しません。

別の可能性は、依存関係の異なるバージョンに関係しています-プロジェクトが(たとえば)バージョン1.2のロギングライブラリを使用しているが、追加されたアセンブリが同じアセンブリに依存しているが、異なるバージョン(たとえば1.3)とプロジェクトのいずれかに依存している場合または、追加されたアセンブリが特定のバージョンを使用するように構成/構築されている場合、競合が発生し、ビルドが失敗します。

これら両方の問題は、説明されているように、アセンブリエイリアスを使用して解決できます here

13
Oded

他の誰もこれについて言及していないので、あなたは尋ねました:

これを軽減するために可能な方法は何ですか

この場合のためのクリーンなソリューションがあり、制約はなく、迷惑な回避策はありません。アセンブリのエイリアスを定義して、コンパイラが適切な場所で参照するエイリアスを認識できるようにすることができます。

http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx をご覧ください

4
Yam Marcovic

はい、これは非常に可能です。
古いバージョンのLucene.Netを使用する一部のDLLへの参照を追加し、最新バージョンを含めたいとします。
externエイリアスを使用することでその問題を解決できます: http://msdn.Microsoft.com/en-us/library/ms173212.aspx

3
šljaker

アセンブリの多くの異なるバージョングローバルアセンブリキャッシュ に好きなように置くことができます(厳密な名前が付けられている場合)。これは、さまざまなアプリケーションでマシンのさまざまなバージョンのアセンブリを使用する場合に役立ちます。ただし、1つのアプリケーションで異なるバージョンのアセンブリを使用すると、問題が発生します。

両方のバージョンを同時に必要とする理由は何ですか?

1
Jalayn

確かに。 2つのオブジェクトを区別できない場合、「あいまいな参照」コンパイラエラーが発生する可能性があります。通常、コードで完全パスを指定でき、問題は発生しませんが、DLLが完全に同一である場合、2つのオブジェクトをどのように区別することもできません。 Syaには2つのDLLがあります。

Fileクラスを含むSystem.IO

そして

Fileクラスを含むMyProject.IO

このようなものがあったら...

using System.IO;
using MyProject.IO;

...
private void foo()
{
    File f = new File();
}

...話しているファイルを判別する方法がないため、参照があいまいになります。これはそれを修正します:

using System.IO;
using MyProject.IO;

...
private void foo()
{
    MyProject.IO.File f = new MyProject.IO.File();
}

修正が困難な唯一の方法は、両方のアセンブリで「ファイル」のパスが同一である場合ですが、2つのDLLが同一の名前空間構造を持つというまれな状況が必要になります。たとえば、(「。Netフレームワークの実際の開発者を除いて)プロジェクトに「システム」という名前を付ける人はいないので、上記の私の状況は決して起こりません。

0