web-dev-qa-db-ja.com

2つのアセンブリで同じ名前のクラス(意図的に)

C++で記述され、C#ラッパーを持つライブラリを移行中です。 C#ラッパー(LibWrapper)には、次のような名前空間を持つクラスのセットがあります。

namespace MyNamespace
   class MyClass
   class MyOtherClass

私の新しいライブラリLibraryCSには、LibWrapperと同じ名前空間とクラス名が含まれているため(ユーザー要件ごと)、次のものもあります。

namespace MyNamespace
   class MyClass
   class MyOtherClass

移行が完了したので、移行を検証するために、両方のライブラリを使用した結果を比較するテストを作成中です。ただし、MyNamespace.MyClassを参照しようとすると、「MyNamespace.MyClassはLibWrapperとLibraryCSの両方で定義されています」というコンパイラエラーが発生します(予想どおりです!)。

この問題を回避するためのトリックはありますか?それにより、まったく同じ名前で、同じクライアントコード内の異なるアセンブリからの2つのクラスを使用できるようになりますか?

あるいは、これをテストする他の方法はありますか?

移行した名前空間の名前をMyNamespace2のような名前に変更することはもちろん機能しますが、クライアントコードの移行を容易にするために、名前を変更しないように求められました。

35
pgb

extern alias を使用して、異なるアセンブリから同じ完全修飾名を持つ型を参照できます。 LibraryCSへの参照を選択し、プロパティページでエイリアスを「グローバル」から「LibraryCS」に更新し、ソースファイルの先頭にextern alias LibraryCS;を追加すると、LibraryCS::MyNamespace.MyClassを使用して参照できます。 LibraryCSのクラス。 MyNamespace.MyClassまたはglobal::MyNamespace.MyClassを使用してLibWrapperのクラスを参照するか、その参照にエイリアスを使用することもできます。

61
Quartermeister

これらのクラスの両方を同じ実行可能ファイルにロードするために、それらを別のアプリケーションドメインにロードすることができます。これにより、アセンブリをテストしてから、完全にアンロードし、2番目のアセンブリをロードしてテストすることができます。

これを行う方法の詳細については、 方法:アセンブリをアプリケーションドメインにロードする および アプリケーションドメインをアンロードする を参照してください。

4
Reed Copsey

この質問と答えを見て、それは私を助けました。しかし、同じことについての詳細な説明が必要な人のために、私は リンク を見つけました。これは本当に便利です。

リンクから抽出します。

1つのアプリケーションで同じdllの異なるバージョンを使用する

ステップ1:VS IDEを使用します。クライアントアプリケーションソリューションの両方のdllへの参照を追加します。次に、ソリューションエクスプローラーの参照ノードの下で、最初の(古いバージョンの)クラスライブラリを選択します。プロパティウィンドウで、[エイリアス]フィールドをglobalからoldVerに変更します。 lly、newVerfor Newer version

ステップ2:以下のコードを参照する予定の最初のステートメントとして使用します

extern alias oldVer;
extern alias newVer;

今使用する、

Console.WriteLine(oldVer::MyLibrary.MyClass.method());
Console.WriteLine(newVer::MyLibrary.MyClass.method());

お役に立てれば。

3
Sin

実行時に最初のアセンブリをロードしてから、リフレクションを使用してインスタンス化し、そのメソッドを実行できます。次に、そのアセンブリをアンロードし、2番目のアセンブリをロードし、リフレクションを使用してアセンブリを作成し、そのメソッドを実行します。

2つの別々のプロセスを使用して、結果の出力を比較する方がおそらく簡単でしょう...

0
Shea