2009-01-17 107 views
3

我得到的回应this question已经解决了我在这个问题中遇到的问题,但我想知道是否可以扩展它一点。例如,如果我要让第三方向这个系统提供命令,是否有办法将我的上一个问题的第一个答案扩展为允许它从一个文件夹中的所有DLL加载所有命令,然后列出它们在列表框中。C#多态 - 从DLL文件加载类

这可能吗?它能够使用ICommand列表(作为我之前提出的问题的答案)。

回答

5

是的。

Assembly commandAssembly = Assembly.Load("some/path") 
var commands = new List<ICommand>(); 

foreach (Type type in commandAssembly.GetTypes()) 
{ 
    if (type.GetInterface(typeof(ICommand).FullName) != null) 
    { 
     commands.Add((ICommand)Activator.CreateInstance(type)); 
    } 
} 

但是,您可能会遇到关于程序集加载的一些限制。你不能从任何地方加载程序集,否则你可能会重新实现像COM DLL DLL这样的东西。

+0

这种加载类型的最佳做法是只加载子目录中的程序集。 – 2009-01-17 22:28:56

1

您可以将每个程序集加载到目录中,遍历程序集中每个暴露的类,然后检查ICommand的实现。然后,您可以通过创建这些对象的新实例将它们添加到您的内部系统。

错误检查有些地方:

  • 大会负荷,确保它是CLR。
  • 构造:确保它不需要任何参数,并且它具有公共构造函数。
  • 构造:确保它不是一个抽象类。