【问题标题】:C# DLL's plugin-architectureC# DLL 的插件架构
【发布时间】:2011-06-12 11:47:24
【问题描述】:

我有一个使用基本插件架构开发的程序。实际上,当程序加载时,它使用反射在目录中搜索适合某个接口的 dll,然后加载它们。 现在看来,当前的插件列表就是所有将要使用的插件。

因此,我目前检查 dll 文件的做法仍然是最佳做法,还是有更好的方法来加载每个 dll?

谢谢。

【问题讨论】:

  • 你能用你的示例代码澄清一下你的问题吗?我问这个是因为我已经开发了一个非常相似的插件架构,它正在扫描插件目录中的 dll。如果我们能看到您的相关来源,我想我们可以提供建议。
  • 您的意思是“适合某个接口的 dll”是指您总是加载所有插件程序集并根据接口检查 CLASSES 吗?你使用反射仅加载吗?您能否更具体地了解“当前的插件列表将被使用”。您的意思是即使在成功加载程序集之后您也根本找不到任何插件? “有没有更好的方法来加载每个 dll”。究竟比什么呢?有趣的话题,但如果不了解更多信息就无法提供帮助。
  • 我真的很想请求有权更改标题的人! IMO 基于什么 OP 什么是相当具有误导性的。我已经重新标记了这个问题。
  • 忘记了 OP 也可以编辑! @Darren 我认为您的问题的标题不是很清楚! =P
  • 以下任何答案是否正确?如果是这样,请选择一个:P

标签: c# dll late-binding plugin-architecture


【解决方案1】:

从您的问题看来,您已经构建(或正在尝试构建)您自己的插件架构。这不是一个好主意,因为 .NET 已经拥有您正在寻找的东西。

.NET 提供了两种允许插件的方法。

  1. System.Addin
  2. MEF - 托管可扩展性框架

(1) System.Addin - 我几乎没有听到/读过很多关于它的信息。但是您可以在这里查看几篇文章:
System.Addin article from MSDN magazine System.Addin tools and examples at Codeplex

(2) 现在,MEF,MEF 真是太棒了!它是一种将插件架构引入系统的简便方法。 MEF 也是 Silverlight 的一部分,Visual Studio 2010 使用它。我可以看到您希望使用插件动态加载 dll,使用 MEF,您可以设计您的应用程序,使您与软件打包的类可以在您自己的程序集 (.exe) 中,然后您可以使用 MEF 动态查找将来会有你需要的类的dll。整个过程本身在MEF中非常简单。

Mike Taulty has a brilliant video series on MEF

MEF Article at Codeproject - Part 1 MEF Article at Codeproject - Part 2

MEF is Open Source on Codeplex

我个人认为你应该使用 MEF,它的新的、简单的甚至 Visual Studio 都使用它,即使你可以看看:
Choosing between MEF and MAF (System.AddIn)

Do check out other top voted questions on the mef tag at SO

【讨论】:

    【解决方案2】:

    您可以使用 FileSystemWatcher 类来监视目录的更改。

    publicvoid CreateWatcher()
    {
    //Create a new FileSystemWatcher.
    FileSystemWatcher watcher = newFileSystemWatcher();
    
    //Set the filter to only catch DLL files.
    watcher.Filter = "*.dll";
    
    //Subscribe to the Created event.
    watcher.Created += new
    FileSystemEventHandler(watcher_FileCreated);
    
    //Set the path to C:\Temp\
    watcher.Path = @"C:\Temp\";
    
    //Enable the FileSystemWatcher events.
    watcher.EnableRaisingEvents = true;
    }
    

    然后它就变成了即插即用的事情:)

    【讨论】:

      【解决方案3】:

      参考MEF 这是一个非常强大的用于创建插件设计的架构解决方案。

      【讨论】:

        【解决方案4】:

        这很好。或者,您也可以定义要在配置文件中加载的程序集,如果您认为在所述文件夹中有大量 DLL 可能会影响您的应用程序并且可能存在一些安全问题,因为任何人都可能将 DLL 推送到该文件夹​​中。

        【讨论】:

          【解决方案5】:
          • 由于插件的意思是:“您不知道要提前加载的 dll”,因此无法提前绑定“未知 dll”,您必须加载并搜索接口实现并使用一种 后期绑定
          • “搜索 dll”而不是“编辑配置文件”非常用户友好。在大多数情况下,搜索 dll 不是性能问题,因为它只在程序启动时完成一次。

          我认为你的设计还可以。

          【讨论】:

            【解决方案6】:

            对于您的场景,我建议使用 MEF 及其 DirectoryCatalog 从特定文件夹加载插件。如果您额外配置文件系统监视器并在文件夹更改时刷新 DirectoryCatalog,感谢 MEF 的重组功能,您将能够在运行时拉取新插件!顺便说一句,你可以看到nice recomposition sample I did for one of my MEF talks

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-10-17
              • 2011-09-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多