C#DLL的插件架构

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

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

谢谢。

从您的问题看起来,您已经构建(或正在尝试构建)您自己的插件架构。 它不是一个好主意,因为.NET已经有了你想要的东西。

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

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

(1) System.Addin – 我几乎没有听到/读过很多关于它的内容。 但你可以看看这里的一些文章:
来自MSDN杂志的System.Addin文章 < - 注意2007年
Codeplex中的System.Addin工具和示例

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

Mike Taulty有一个关于MEF的精彩video系列

Codeproject的MEF文章 – CodeProject的第1部分 MEF文章 – 第2部分

MEF是Codeplex上的开源

我个人认为你应该选择MEF,它新的,简单的,甚至是视觉工作室使用它,即使你可以看看:
在MEF和MAF之间选择(System.AddIn)

请查看SO上mef标签上的其他最高投票问题

您可以使用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; } 

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

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

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

  • 由于插件意味着:“你不知道要提前加载的dll”没有办法早期绑定“unknown-dll”你必须加载并搜索接口实现并使用一种后期绑定
  • “搜索dll”而不是“编辑配置文件”非常用户友好。 在大多数情况下,搜索dll不是性能问题,因为它在程序启动时只执行一次。

我觉得你的设计还可以。

对于您的场景,我建议使用MEF及其DirectoryCatalog从特定文件夹加载插件。 如果您另外配置文件系统观察程序并在文件夹更改时刷新DirectoryCatalog,由于MEF的重组function,您将能够在运行时提取新插件! 顺便说一句,你可以看到我为我的一次MEF谈话做的一个很好的重组样本 。