C# DLL的插件架构

8
我有一个使用基本插件架构的程序。当程序加载时,它会使用反射来搜索符合特定接口的dll文件并加载它们。现在看来,当前插件列表是唯一使用的。
因此,我的目前做法仍然是检查dll文件的最佳实践,还是有更好的方法来加载每个dll?
谢谢。

你能否用你的示例代码稍微澄清一下你的问题?我问这个是因为我已经开发了一个非常类似的插件架构,它可以扫描插件目录中的dll。如果我们能看到你相关的源代码,我想我们可以给出建议。 - HuseyinUslu
你所说的“符合某个特定接口的dll”是指你总是加载所有插件程序集并根据接口检查类吗?你使用反射仅加载吗?“当前插件清单中列出的所有插件都将被使用”,您能更具体地说明吗?您是否意味着即使成功加载程序集后也无法找到任何插件?“有更好的方法来加载每个dll”。相对于什么?这是一个有趣的主题,但在获取更多信息之前我无法提供帮助。 - Imre Pühvel
我真的很想请求有权限的人更改标题!在我看来,根据原帖内容,标题相当具有误导性。我已经重新标记了这个问题。 - gideon
忘记了原帖作者也可以编辑!@Darren,我认为你的问题标题不是很清楚!=P - gideon
以下哪个答案是正确的?如果有,请选择一个 :P - The_Butcher
6个回答

15

从你的问题看来,你已经构建了(或者正在尝试构建)自己的插件架构。这并不是一个好主意,因为.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动态查找未来将拥有你所需类的dll。整个过程在MEF中非常简单。

Mike Taulty有一系列关于MEF的精彩视频

Codeproject的MEF文章 - 第1部分 Codeproject的MEF文章 - 第2部分

MEF 已在 Codeplex 上成为开源项目

我个人认为你应该采用 MEF,它是新的、易用的,甚至 Visual Studio 也在使用它,你可以查看以下链接来了解更多信息:
选择 MEF 和 MAF (System.AddIn) 之间的区别

请查看 SO 上 MEF 标签下的热门问题


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;
}

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

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

1

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


0
  • 由于插件的意思是:“您事先不知道要加载哪个DLL”,因此无法提前绑定该“未知DLL”,您必须加载并搜索接口实现,并使用一种后期绑定
  • 与“编辑配置文件”相比,“搜索DLL”非常用户友好。在大多数情况下,搜索DLL不会成为性能问题,因为它只在程序启动时执行一次。

我认为您的设计很不错。


0

针对您的情况,我建议使用MEF及其DirectoryCatalog从特定文件夹加载插件。如果您还配置了文件系统监视器并在文件夹更改时刷新DirectoryCatalog,由于MEF的重新组合功能,您将能够在运行时拉取新的插件!顺便说一句,您可以查看我为我的一个MEF演讲做的不错的重新组合示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接