C# 在运行时从动态加载的dll创建对象列表
我有一个在运行时加载的dll。我试图在运行时从动态加载的dll中创建每种类型的实例,并将这些实例添加到列表中。dll中的所有类都基于AYClass,因此它们应该成功地添加到列表中。但是我犯了如下这样的错误C# 在运行时从动态加载的dll创建对象列表,c#,oop,dynamic,dll,C#,Oop,Dynamic,Dll,我有一个在运行时加载的dll。我试图在运行时从动态加载的dll中创建每种类型的实例,并将这些实例添加到列表中。dll中的所有类都基于AYClass,因此它们应该成功地添加到列表中。但是我犯了如下这样的错误 Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException' in Microsoft.CSharp.dll Additional information: An unex
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
}
}
Assembly=Assembly.LoadFrom(@“D:\Library\CurrencyData.dll”);
List listObjects=新列表();
foreach(在assembly.GetExportedTypes()中键入类型)
{
if(type.BaseType.ToString()包含(“AYClass”))
{
动态c=Activator.CreateInstance(类型);
listObjects.Add(c);//*******异常在此处引发
}
}
我应该怎么做才能解决这个问题?当您知道基本类型时,为什么要使用
动态
?不要那样做。改用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);
}
}
Assembly=Assembly.LoadFrom(@“D:\Library\CurrencyData.dll”);
List listObjects=新列表();
foreach(在assembly.GetExportedTypes()中键入类型)
{
if(type.BaseType.ToString()包含(“AYClass”))
{
var c=(AYClass)Activator.CreateInstance(类型);
添加(c);
}
}
一般来说,C#是一种类型安全的语言,因此使用动态
应该是例外。还要确保,在动态加载的dll和“加载程序”中,它们使用完全相同的基类。在任何其他情况下,转换实例都将失败
此外,您可以使用比较类型而不是其名称来替换此行:
if(type.BaseType.ToString().Contains(“AYClass”)
。这不是很安全,因为具有相同名称的类可以在同一程序集中的不同程序集和/或命名空间中声明。hi,如果使用“var”,则不能使用listObjects.add(c)。必须将对象类型强制转换为AYClass@ayilmaz您可以使用AYClass c=(AYClass)Activator.CreateInstance(类型)代码>变量只是一个隐藏类型的简写<代码>var
仍然有效。@BendEg,它给了我这个错误,无法将类型为“AY.CurrencyData.Model.Currency”的对象强制转换为类型为“AY.CurrencyData.Model.AYClass”。是的,您的问题是没有相同的基类。它们在不同的程序集中声明吗?是的,它们在不同的程序集中声明