Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#多态性-从DLL文件加载类_C#_Oop_Dll - Fatal编程技术网

C#多态性-从DLL文件加载类

C#多态性-从DLL文件加载类,c#,oop,dll,C#,Oop,Dll,我的回答应该解决了我在那个问题上遇到的问题,但我想知道是否有可能把它扩展一点。例如,如果我让第三方向这个系统提供命令,是否有一种方法可以扩展我上一个问题的第一个答案,允许它加载文件夹中所有DLL中的所有命令,然后在列表框中列出它们 可能吗?它是否能够处理ICommand列表(如我前面问题的答案所示)。您可以在目录中加载每个程序集,迭代程序集中每个公开的类,然后检查ICommand的实现。然后,您可以通过创建这些对象的新实例,将它们添加到您的内部系统中 用于错误检查的某些位置: 程序集加载,请确

我的回答应该解决了我在那个问题上遇到的问题,但我想知道是否有可能把它扩展一点。例如,如果我让第三方向这个系统提供命令,是否有一种方法可以扩展我上一个问题的第一个答案,允许它加载文件夹中所有DLL中的所有命令,然后在列表框中列出它们


可能吗?它是否能够处理ICommand列表(如我前面问题的答案所示)。

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

用于错误检查的某些位置:

  • 程序集加载,请确保它是CLR
  • 构造:确保它不需要任何参数,并且具有公共构造函数
  • 构造:确保它不是抽象类
  • 是的

     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));
        }
     }
    
    Assembly commandAssembly=Assembly.Load(“一些/路径”)
    var命令=新列表();
    foreach(commandAssembly.GetTypes()中的类型)
    {
    if(type.GetInterface(typeof(ICommand.FullName)!=null)
    {
    Add((ICommand)Activator.CreateInstance(type));
    }
    }
    

    但是,您可能会遇到一些有关程序集加载的限制。您不能只从任何地方加载程序集,否则您可以重新实现COM DLL地狱之类的东西。

    这种加载类型的最佳实践是只加载子目录中的程序集。