在运行时从动态加载的dll创建对象列表

本文关键字:dll 创建对象 列表 加载 运行时 动态 | 更新日期: 2023-09-27 18:01:42

我有一个在运行时加载的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
    }
}

我该怎么做来解决这个问题?

在运行时从动态加载的dll创建对象列表

既然知道基本类型,为什么还要使用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"))替换为比较类型而不是其名称。这不是很安全,因为具有相同名称的类可以在不同的程序集中声明,或者可以在同一程序集中声明名称空间。