【问题标题】:Create a list of objects from dynamically loaded dll on runtime在运行时从动态加载的 dll 创建对象列表
【发布时间】:2016-12-17 08:26:14
【问题描述】:

我有一个在运行时加载的 dll。我正在尝试从运行时动态加载的 dll 创建每个类型的实例,并将这些实例添加到列表中。 dll中的所有类都基于AYClass,因此应该成功地将它们添加到List中。但是我遇到了如下错误

Exception thrown: 
'Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException' in Microsoft.CSharp.dll

Additional information: An unexpected exception occurred while binding a dynamic operation

我的代码如下...

Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll");
List<AYClass> listObjects = new List<AYClass>();
foreach (Type type in assembly.GetExportedTypes())
{
    if (type.BaseType.ToString().Contains("AYClass"))
    {
        dynamic c = Activator.CreateInstance(type);
        listObjects.Add(c); // ******* Exception is thrown here
    }
}

我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: c# oop dynamic dll


    【解决方案1】:

    既然知道基本类型,为什么还要使用dynamic?不要那样做。改用 var:

    Assembly assembly = Assembly.LoadFrom(@"D:\Library\CurrencyData.dll");
    List<AYClass> listObjects = new List<AYClass>();
    foreach (Type type in assembly.GetExportedTypes())
    {
        if (type.BaseType.ToString().Contains("AYClass"))
        {
            var c = (AYClass)Activator.CreateInstance(type);
            listObjects.Add(c);
        }
    }
    

    一般来说,C# 是一种类型安全的语言,所以使用dynamic 应该是例外的。还要确保,在动态加载的 dll 和“加载器”中,它们使用完全相同的基类。在任何其他情况下,实例转换都会失败。

    此外,您可以替换此行:if (type.BaseType.ToString().Contains("AYClass")) 比较类型而不是其名称。这不是很安全,因为同名的类可以在同一个程序集中的不同程序集和/或命名空间中声明。

    【讨论】:

    • 嗨,如果您使用“var”,则不能使用 listObjects.add(c)。您必须将对象类型转换为 AYClass
    • @ayilmaz 您可以使用AYClass c = (AYClass)Activator.CreateInstance(type); var 只是隐藏类型的简写。 var 仍然有效。
    • @BendEg,它给了我这个错误 Unable to cast object of type 'AY.CurrencyData.Model.Currency' to type 'AY.CurrencyData.Model.AYClass'。
    • 是的,你的问题是你没有相同的基类。它们是在不同的程序集中声明的吗?
    • 是的,它们在不同的程序集中声明
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2020-04-12
    • 2020-09-24
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多