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
のような名前に変更することはもちろん機能しますが、クライアントコードの移行を容易にするために、名前を変更しないように求められました。
extern alias を使用して、異なるアセンブリから同じ完全修飾名を持つ型を参照できます。 LibraryCSへの参照を選択し、プロパティページでエイリアスを「グローバル」から「LibraryCS」に更新し、ソースファイルの先頭にextern alias LibraryCS;
を追加すると、LibraryCS::MyNamespace.MyClass
を使用して参照できます。 LibraryCSのクラス。 MyNamespace.MyClass
またはglobal::MyNamespace.MyClass
を使用してLibWrapperのクラスを参照するか、その参照にエイリアスを使用することもできます。
これらのクラスの両方を同じ実行可能ファイルにロードするために、それらを別のアプリケーションドメインにロードすることができます。これにより、アセンブリをテストしてから、完全にアンロードし、2番目のアセンブリをロードしてテストすることができます。
これを行う方法の詳細については、 方法:アセンブリをアプリケーションドメインにロードする および アプリケーションドメインをアンロードする を参照してください。
この質問と答えを見て、それは私を助けました。しかし、同じことについての詳細な説明が必要な人のために、私は リンク を見つけました。これは本当に便利です。
リンクから抽出します。
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());
お役に立てれば。
実行時に最初のアセンブリをロードしてから、リフレクションを使用してインスタンス化し、そのメソッドを実行できます。次に、そのアセンブリをアンロードし、2番目のアセンブリをロードし、リフレクションを使用してアセンブリを作成し、そのメソッドを実行します。
2つの別々のプロセスを使用して、結果の出力を比較する方がおそらく簡単でしょう...