サードパーティの dll を使用しています。一部の名前空間でクラスを使用していますnamespace.class
。
新しいバージョンでは、そのクラスは別の名前空間に移動されたため、現在はnewnamespace.newpart.class
. 私のコードは両方のケースをサポートする必要があります。これを解決するにはどうすればよいですか?
サードパーティの dll を使用しています。一部の名前空間でクラスを使用していますnamespace.class
。
新しいバージョンでは、そのクラスは別の名前空間に移動されたため、現在はnewnamespace.newpart.class
. 私のコードは両方のケースをサポートする必要があります。これを解決するにはどうすればよいですか?
クラスが 2 つの名前空間に存在する場合、それは同じクラスではありません。2つの異なるクラスです。
さまざまなクラスを「サポート」する方法は無数にありますが、実装に完全に依存します。つまり、「両方のケースをサポートする」とはどういう意味ですか。
サード パーティの dll の遅延バインディングを開発し、それがどのバージョンであるかを確認します。適切な名前空間に適切なオブジェクトの新しいインスタンスを作成できます。
ここにいくつかのサンプルコードがあります:
//load dll
System.Reflection.Assembly myDllAssembly =
System.Reflection.Assembly.LoadFile("myspeciallibrary.dll");
//create object
Object MyDLLObjectInstance;
//initialize object
if (myDllAssembly.ImageRuntimeVersion == "version2")
{
MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.MyDLLObject");
}
else
{
MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.NewNameSpace.MyDLLObject");
}
私の最初のアドバイスは、コードベースが同じアセンブリを使用していることを確認することです。したがって、コードをリファクタリングして、一貫性を保ち、新しいバージョンを使用するようにします。そうすれば、この問題全体が解消されます。
それが望ましくない場合は、使用されているバージョンに応じて、ファイルでエイリアスする必要があります。たとえば、次のようになります。
従来の .cs ファイル:
using ThirdPartyClass = ThirdPartyNamespace1.Class
新しい .cs ファイル:
using ThirdPartyClass = ThirdParty.OtherNameSpace.Class
古いバージョンと新しいバージョンの互換性によっては、問題が発生する可能性があることに注意してください。あなたは本当にオプション1を検討する必要があります.そして、「私のコードでそれをすべて変更したくない」という言い訳は言い訳ではありません(そして、私はそれがそうであると推測しているのではなく、ただ言っているだけです:))
これを行う方法の 1 つは、MEF を使用することです。2 つのアダプター クラス/MEF オブジェクトを別々のアセンブリに記述し、使用しているサード パーティ ライブラリを確認して、適切なアダプター クラスをロードします。
現時点では、アプリケーションがリンクしているときに名前空間を認識している必要があります。したがって、同じ方法で 2 つの異なる DLL をサポートするアプリを作成することはできません。
したがって、コンパイル後に dll を変更する方法はありません。
1 つまたは別のクラスが利用可能な場合は、別のクラスを使用するようにコードを処理することができます。
クラスが一意であると仮定すると (つまり、 から に完全に移動しnamespace.class
たnamespace.newpart.class
場合、両方の名前空間を含めることができます...
これはコンパイルされるはずですが、実行時にライブラリがスワップアウトされていると機能しません...