2016-09-26 4 views
0

COMオブジェクトであるサードパーティアプリケーションを使用するにはC#ライブラリを作成する必要があります。現在、アプリケーションがSample1.dllについては、以下の言及、ユーザー入力に基づいて実行時にdllを動的に変更する

Version 1 (Sample1.dll) 

namespace Sample 
{ 
    public interface IApplication 
    { 
     string Version { get; } 
    } 
} 

Version 2 (Sample2.dll) 

namespace Sample 
{ 
    public interface IApplication 
    { 
     string Version { get; } 
    } 
} 

などの2つのバージョン(旧)バージョン1およびバージョン2(新)のProgIDであることSample.Application.1とSample2.dllがSample.Applicationです。 2となる。

私のプロジェクトでdllのバージョンを参照し、IApplicationインターフェイスを使用したいと思います。

static void Main(string[] args) 
{ 
    int version = 0; 
    if (int.TryParse(Console.ReadLine(), out version)) 
    { 
     Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version)); 
     object item = Activator.CreateInstance(comType); 

     IApplication application = item as IApplication; 

     Console.WriteLine("Version: {0}", application.Version); 
    } 
} 

私は

1. Sample1.dll and use Sample.Application.1 as ProgID 
2. Sample2.dll and use Sample.Application.2 as ProgID 

を参照している場合、上記のコードは動作します。しかし、私は、動的にプログラムIDに基づいて、サンプルのDLLを変更し、IApplicationインターフェイスを使用します。

基本的に私は、dll(Sample1.dllとSample2.dll)の2つのバージョンをサポートするコードを記述したいと思います。

+0

あなたは別の名前でdllを別名にすることができます。あなたは.DLL /名前空間についてはエイリアスに精通していますか? – MethodMan

+0

エイリアスを使用すると、両方のバージョンのコードのコードを複製する必要があります。私の場合は、両方のバージョンをサポートする単一のコードを記述する必要があります。 – Babu

答えて

0

あなたのコードが書き込むことができる独自のプロキシクラスを作成することが最善の解決策です。プロキシのコンストラクタで、必要なバージョンを指定できます。

以下の例では、dynamicを使用する簡単な方法を説明していますが、コンパイル時のタイプの安全性は低いですが、すべてのメンバーがプロキシメンバーと同じ名前でなければならないため、 。 Sample1.dllSample2.dllも参照として追加されていません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     int version = 0; 
     if (int.TryParse(Console.ReadLine(), out version)) 
     { 
      IApplication application = new ApplicationProxy(version); 

      Console.WriteLine("Version: {0}", application.Version); 
     } 
    } 
} 

/// <summary> 
/// A copy of IApplication that is local to your program that holds the shared members. 
/// This is what the rest of your program will likely use. 
/// </summary> 
public interface IApplication 
{ 
    string Version { get; } 
} 

public class ApplicationProxy : IApplication 
{ 
    private readonly dynamic _application; 
    public ApplicationProxy(int version) 
    { 
     Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version)); 
     _application = Activator.CreateInstance(comType); 
    } 

    public string Version 
    { 
     get { return _application.Version; } 
    } 
} 

あなたはdynamicを取り除くと別名を使用して参照としてSample1.dllSample2.dllの両方を追加するが、それははるかに複雑なコードになります得ることができました。

関連する問題