C#DLL的插件架构
我有一个程序,我开发使用基本的插件架构。实际上,当程序加载时,它使用反射来搜索适合某个接口的dll的目录,然后加载它们。 现在看来,目前的插件列表是所有将被使用的。C#DLL的插件架构
因此,我目前的做法是检查dll文件还是最佳做法,还是有更好的方法来加载每个dll?
感谢。
从您的问题看,您似乎已经构建(或正在尝试构建)您自己的插件架构。它不是一个好主意,因为.NET已经有你正在寻找的东西。
.NET带有两种允许插件的方式。
- System.Addin
- 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)
您可以使用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;
}
然后它成为一个即插即用的事情:)
这很好。或者,如果您觉得在所述文件夹中有大量DLL可能会影响您的应用程序,并且可能存在一些安全问题,因为任何人都可能将DLL推送到该文件夹中,您也可以定义要将哪些程序集加载到配置文件中。
- 由于插件意思是:“你DONOT知道DLL提前装入”有没有办法提前绑定的部份“未知DLL”你必须加载和搜索界面的实现,并使用一种后期绑定。
- “搜索DLL”而不是“编辑配置文件”非常友好。在大多数情况下,搜索DLL不是一个性能问题,因为它只在程序启动时完成一次。
我觉得你的设计还行。
对于您的场景,我建议使用MEF及其DirectoryCatalog从特定文件夹加载插件。如果您另外配置文件系统观察器并刷新文件夹更改的DirectoryCatalog,多亏了MEF的重新构建功能,您将能够在运行时提取新的插件!顺便说一句,你可以看到一个nice recomposition sample I did for one of my MEF talks。
你能用你的示例代码来澄清一下你的问题吗?我问这是因为我已经开发了一个非常类似的插件体系结构,它正在扫描插件目录中的dll。如果我们能看到你的相关资料,我想我们可以提供建议。 – HuseyinUslu 2011-01-20 14:05:24