C#DLL的插件架构

时间:2011-01-20 14:00:11

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

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

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

感谢。

6 个答案:

答案 0 :(得分:14)

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

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

  1. System.Addin
  2. MEF - 托管扩展框架
  3. (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来动态查找将来会有你需要的课程。在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一起使用,它的新的,简单的,甚至是视觉工作室使用它,即使你可以看看:
    Choosing between MEF and MAF (System.AddIn)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

我认为你的设计还可以。

答案 5 :(得分:0)

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