2009-07-03 6 views
3

サードパーティのサプライヤのリファレンスを使用した製品があります。彼らの新製品のリリースで、彼らはこの参照を新しい名前に改名しました。製品リリースではライブラリ名が変更され、古いものと新しいものとの互換性はどのようになっていますか?

私たちがしたいことは、アプリケーションの1つのバージョンをコンパイルして、ライブラリの古い名前と新しい名前の両方に対して実行できるようにすることです。

基本的に変更はありませんが、私たちが使用するライブラリの部分の間にメソッド名を変更するのは1つだけですが、両方を扱えるようにアプリケーションを開発する方法はわかりません。

両方で動作するようにコードを分岐する必要がある場合は、すべての呼び出しが通過して古いか新しいかに分かれているアダプタを用意したいと思っています。

新しいアプリケーションをインストールすると古いライブラリが削除されるため、古いコードはコンパイルされません。

私は何を試すことができますか、どのようにこの問題を回避することができますか?

また、アプリケーションは、Visual Studioを使用してC#で開発され、2005年

答えて

3

を参照してください。Assembly Binding Redirection ...古いDLL参照を新しいものにリダイレクトできます。名前を変更したメソッドのラッパーメソッドを記述する必要があります。これは、バットの本当の痛みです。私はスピットボールこのオフに私の頭の上つもりだので、私は名前の精度やcompilabilityを保証するものではありませんが、あなたはそれの擬似コードを検討することができます...そんな

private bool _useOldMethodName = false; 
public void MethodAlias(string arg1) 
{ 
    if (_useOldMethodName) 
    { 
     Reference.OldFunctionName(arg1); 
    } 
    else 
    { 
     try 
     { 
      Reference.NewFunctionName(arg1); 
     } 
     catch (MethodNotFoundException mnfe) 
     { 
      _useOldMethodName = true; 
     } 
    } 
} 

何か。いずれにしても理想的ではありません。

私は不思議ですが、どうしてあなたはいつも新しいリファレンスを使用できませんか?あなたのコードで新しい参照DLLを配布するだけで、問題は発生しません。

+0

このライブラリがあるアプリケーションとはるかに大きなシステムの部分は制御しません。提供されたAPIを介していくつかの機能を実行するアドオンがあります。 私は古いものと新しいdllを同じマシンにインストールして遊んできましたが、うまくいくように見えますが、これはわずかなテストであり、それがうまくいくかどうかは分かりません。 私はリダイレクトのアイデアが好きで、スピンを出して何が出てくるかを見ていきます。ありがとう。 – stevemac

1

私はあなたの次のステップにお勧めします:

  • 独自のクラスを持っていることによって、ライブラリへの呼び出しを隔離するようにコードをリファクタリングライブラリから継承しています(今のところ独自のメソッドはありません)。
  • 2つのメソッドのどちらが利用可能かを調べるには、この単一クラス内のReflectionを使用します。ライブラリを非常に頻繁に呼び出すときは、実際の方法をキャッシュしてパフォーマンスの低下を避けます。実際の反射は次のようになります。

    タイプtype = Type.GetType(エイリアン); MemberInfo [] mbrInfoArray = type.GetMethods();

このメソッドは、Invokeを使用して呼び出されます。

関連する問題