2016-09-26 86 views
0

我必須創建一個C#庫才能使用第三方應用程序,它是一個COM對象。目前,該應用程序有兩個版本版本1(舊)和第2版(新),如下提,根據用戶輸入在運行時動態更改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; } 
    } 
} 

的進程id爲Sample1.dll是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 

但我要動態地改變根據的ProgID樣品DLL和使用IApplication接口。

基本上我想編寫支持兩個版本的DLL(Sample1.dll和Sample2.dll)的代碼。

+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作爲使用別名的引用,但是,這將導致更復雜的代碼。

相關問題