在C#中动态加载一个类

时间:2013-08-19 18:41:21

标签: c# dll

我试图在不知道程序集的名称的情况下加载一个类(比如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'.

我真的不知道为什么以及如何解决这个问题。

2 个答案:

答案 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);