我有一个在运行时加载的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
}
}
我该怎么做才能解决这个问题?
答案 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"))
。这不是很安全,因为可以在同一程序集中的不同程序集和/或名称空间中声明具有相同名称的类。