C#DLL的插件架构

问题描述:

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

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

感谢。

+0

你能用你的示例代码来澄清一下你的问题吗?我问这是因为我已经开发了一个非常类似的插件体系结构,它正在扫描插件目录中的dll。如果我们能看到你的相关资料,我想我们可以提供建议。 – HuseyinUslu 2011-01-20 14:05:24

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

.NET带有两种允许插件的方式。

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

(1) System.Addin - 我几乎没有听说过/读的不多。但是你可以在这里几篇文章看一看:
System.Addin article from MSDN magazine < - 注意2007年度
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中使用它,即使是这样,你可以去看看at:
Choosing between MEF and MAF (System.AddIn)

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

您可以使用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推送到该文件夹​​中,您也可以定义要将哪些程序集加载到配置文件中。

  • 由于插件意思是:“你DONOT知道DLL提前装入”有没有办法提前绑定的部份“未知DLL”你必须加载和搜索界面的实现,并使用一种后期绑定
  • “搜索DLL”而不是“编辑配置文件”非常友好。在大多数情况下,搜索DLL不是一个性能问题,因为它只在程序启动时完成一次。

我觉得你的设计还行。

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