回答:
これは非常に可能です。
異なるアセンブリ(またはプロジェクトと追加されたアセンブリ)で同じ名前空間と型名を定義した場合、これらの型のいずれかを使用しようとするコードとの競合が発生します。
参照と同様に、一意の名前空間があることを確認すると、この問題は発生しません。
別の可能性は、依存関係の異なるバージョンと関係があります-プロジェクトが(たとえば)バージョン1.2のログライブラリを使用しているが、追加されたアセンブリが同じアセンブリであるが異なるバージョン(たとえば1.3)とプロジェクトのいずれかに依存している場合または、追加されたアセンブリが特定のバージョンを使用するように構成/構築されている場合、競合が発生し、ビルドが失敗します。
他の誰もこれについて言及していないので、あなたは尋ねました:
これを軽減するために可能な方法は何ですか
この場合のためのクリーンなソリューションがあり、制約はなく、迷惑な回避策はありません。アセンブリのエイリアスを定義して、コンパイラが適切な場所で参照するエイリアスを認識できるようにすることができます。
見てhttp://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx
はい、これは非常に可能です。
たとえば、Lucene.Netの古いバージョンを使用するDLLへの参照を追加し、最新バージョンを含めたいとします。
externエイリアスを使用すると、この問題を解決できます。http://msdn.microsoft.com/en-us/library/ms173212.aspx
アセンブリの厳密な名前が付けられていれば、アセンブリのさまざまなバージョンをグローバルアセンブリキャッシュにいくつでも置くことができます。これは、さまざまなアプリケーションでマシンのさまざまなバージョンのアセンブリを使用する場合に役立ちます。ただし、1つのアプリケーションで異なるバージョンのアセンブリを使用すると、問題が発生します。
両方のバージョンを同時に必要とする理由は何ですか?
確かに。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フレームワークの実際の開発者を除いて)プロジェクトに「システム」という名前を付ける人はいないため、上記の私の状況は決して起こりません。