根据用户输入在运行时动态更改dll

时间:2016-09-26 18:07:58

标签: c# dynamic dll

我必须创建一个C#库来使用第三方应用程序,它是一个COM对象。目前,该应用程序有两个版本:Version 1(旧)和Version 2(new),如下所述,

Version 1 (Sample1.dll)

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

Version 2 (Sample2.dll)

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

Sample1.dll的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

但我想基于ProgID动态更改示例dll并使用IApplication接口。

基本上我想编写支持两个版本的dll(Sample1.dll和Sample2.dll)的代码。

1 个答案:

答案 0 :(得分: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作为参考,但这将导致更复杂的代码。