【问题标题】:Dynamically Changing dll at runtime based on user input [duplicate]根据用户输入在运行时动态更改 dll [重复]
【发布时间】:2017-02-04 04:36:46
【问题描述】:

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

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)的代码。

【问题讨论】:

  • 你能用不同的名字为 dll 命名吗?你熟悉 .DLL / 命名空间的别名吗?
  • 据我了解,如果我使用别名,我必须为两个版本的代码复制代码。就我而言,我必须编写一个支持这两个版本的代码。

标签: c# dynamic dll


【解决方案1】:

最好的解决方案是制作你自己的代理类,你的代码可以针对它编写,在代理的构造函数中你可以指定你想要的版本。

在下面的示例中,我采用了使用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 作为引用,但这会导致代码更加复杂。

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2021-12-02
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多