同じネームスペースを持つ2つのDLLファイルがありますが、メソッドとタイプは異なります。プロジェクトで両方のDLLを参照し、メソッドとタイプを使用するにはどうすればよいですか?
ところで、これらの2つのDLLには、同じ名前で実装が異なるいくつかのメソッドと型、およびいくつかの一意のメソッドと型があります。
特別なことは必要ありません-それらを参照し、型を使用するだけです。名前空間は、実際には不透明な型ではないため、問題なく複数のアセンブリにまたがることができます。名前空間は、含まれるすべてのタイプに共通のプレフィックスを追加する方法であり、異なる名前空間で同じ名前の複数のタイプを持つことができます。 (フレームワークはそれらの名前が同じであるとは見なしません。なぜなら、すべての「完全修飾」名を見るからです-エイリアスと名前空間がその前に付いています。)
まれに、同じ型名を持つ2つのアセンブリを参照する場合and同じ名前空間(同じdllの2つの異なるバージョンなど)-特定の型に使用するアセンブリを区別するにはエイリアス。すべての参照のデフォルトのエイリアスはglobal
ですが、アセンブリを参照するときに(コンパイラスイッチを使用するか、Visual Studioのプロパティボックスを使用するだけで)、extern alias <name>
句を使用して独自のエイリアスを指定できます。使用するコードファイルの先頭で-<name>::MyNamespace.Type
を使用して異なるアセンブリの型にアクセスします
まったく同じ名前の2つのタイプがあり(名前に名前空間が含まれていることに注意してください)、異なるDLLにあり、両方を使用することに興味がある場合は、これを行うことができます。
簡易回答
2つの異なるDLLにAcme.Foo
タイプがあり、それらを使用する場合。参照プロパティウィンドウ(参照|プロパティウィンドウ)で参照にエイリアスを指定し、次のように使用します。
extern alias TheAliasYouGaveTheReference
TheAliasYouGaveTheReference::Acme.Foo f = new
TheAliasYouGaveTheReference::Acme.Foo();
デフォルトの名前空間は global
(C#プログラムの場合) ですが、上記のglobal
の代わりに作成したエイリアスを使用していることに注意してください。
最適なアプローチは、[〜#〜] not [〜#〜]そもそもこのような状況に陥ることです。両方のアセンブリが独自のものである場合、作成しないでください。まったく同じ名前空間にまったく同じ名前を持つ2つのタイプ。ただし、ソースコードを制御しない場合があります。そのため、上記のソリューションを使用できます。
ロングアンサー
here からほとんどの記事をコピーしているため、記事が利用できなくなった場合に備えてここに記録されます。
どうやってこのような状況に陥りますか?
まず、シナリオを複製する方法を次に示します。これにより、私たちが何を話しているのかが明確になります。
Class1.csのテンプレートコードを次のコードに置き換えます。
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}
ソリューションエクスプローラーでソリューションを右クリックし、[追加]を選択します。新たなプロジェクト
Class1.csのコードを次のコードに置き換えます。
using System;
namespace Acme
{
public class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
public void Goo()
{
Console.WriteLine("Goo");
}
}
}
アプリケーションでのタイプの使用法
わかりましたので、Acme.Foo
を含む2つの異なるアセンブリができました。コンソールアプリケーションを作成して、それぞれを使用してみましょう。
ConsumerプロジェクトのProgramタイプのMainに次の行を追加します。
Acme.Foo f = new Acme.Foo();
Ctrl + Shift + B(またはF6)を使用してソリューションをビルドします。次の2つのビルドエラーが発生することに注意してください。
修正
修正方法は次のとおりです。
ConsumerプロジェクトのProgram.csの先頭に次のディレクティブを追加します。
extern alias FooVersion1;
Acme.Fooの使用法を次のように変更します。
FooVersion1::Acme.Foo f = new FooVersion1::Acme.Foo();
f.Bar();
「f」と入力すると、完了リストにはAcme.FooのFooVersion1のメソッドのみが含まれることに注意してください(特にGooは含まれません)。
最後に、ConsumerプロジェクトのProgram.csのf.Bar()の下に次のコードを追加します。
Acme.Foo f2 = new Acme.Foo();
f2.Goo();
F2の完了リストにGooが含まれていることに注意してください。
/ reference(メタデータのインポート)(C#コンパイラオプション)コンパイラオプションのエイリアス機能を使用して問題を解決できます。詳細については here を参照してください。