2016-09-26 71 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作为使用别名的引用,但是,这将导致更复杂的代码。

相关问题