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

时间:2016-08-10 19:37:40

标签: c# oop dynamic dll

我有一个在运行时加载的dll。我试图在运行时从动态加载的DLL创建每个Type的实例,并将这些实例添加到List中。 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
    }
}

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

1 个答案:

答案 0 :(得分:2)

为什么在知道基本类型时会使用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和你的#34; loader&#34;他们使用完全相同的基类。在任何其他情况下,实例都将失败。

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