在运行时从动态加载的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
}
}
我该怎么做来解决这个问题?
既然知道基本类型,为什么还要使用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"))
替换为比较类型而不是其名称。这不是很安全,因为具有相同名称的类可以在不同的程序集中声明,或者可以在同一程序集中声明名称空间。