我试图在不知道程序集的名称的情况下加载一个类(比如Class1:Interface)。 我的代码如下所示:
Assembly a = Assembly.LoadFrom("MyDll.dll");
Type t = (Type)a.GetTypes()[0];
(Interface) classInstance = (Interface) (ClasActivator.CreateInstance(t);
根据我在网上找到的文章和MSDN,GetTypes()[0]
假设返回Class1(MyDll.dll中只有一个类)。但是,我的代码返回Class1.Properties.Settings
。因此第3行创建了一个例外:
Unable to cast object of type 'Class1.Properties.Settings' to type Namespace.Interface'.
我真的不知道为什么以及如何解决这个问题。
答案 0 :(得分:3)
程序集可以容纳多个类型(你可能在dll中有一个Settings.settings
文件,它在Settings.Designer.cs
文件中创建了一个类,你只能获得第一个类你的代码在你的案例中被证明是Settings
类,你需要遍历所有类型并搜索那些具有你需要的接口的代码。
Assembly asm = Assembly.LoadFrom("MyDll.dll");
Type[] allTypes = asm.GetTypes();
foreach (Type type in allTypes)
{
// Only scan objects that are not abstract and implements the interface
if (!type.IsAbstract && typeof(IMyInterface).IsAssignableFrom(type));
{
// Create a instance of that class...
var inst = (IMyInterface)Activator.CreateInstance(type);
//do your work here, may be called more than once if more than one class implements IMyInterface
}
}
答案 1 :(得分:2)
只需检查以找到实现该接口的第一个:
Type t = a.GetTypes()
.FirstOrDefault(type => type.GetInterface(typeof(Interface).FullName) != null);