8

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

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

谢谢。

4

6 回答 6

15

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

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

  1. 系统插件
  2. MEF - 托管可扩展性框架

(1) System.Addin - 我几乎没有听过/读过很多关于它的信息。但是您可以在这里查看一些文章:
来自 MSDN 杂志的 System.Addin 文章<- 请注意
Codeplex 的 2007 年 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 标签上的其他投票最多的问题

于 2011-01-20T14:17:14.387 回答
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;
}

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

于 2011-01-20T14:05:25.140 回答
3

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

于 2011-01-20T14:06:16.470 回答
1

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

于 2011-01-20T14:06:21.963 回答
0

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

于 2011-09-25T08:07:04.103 回答
0
  • 由于插件的意思是:“您不知道要提前加载的 dll”,因此无法提前绑定“未知 dll”,您必须加载并搜索接口实现并使用一种后期绑定
  • “搜索 dll”而不是“编辑配置文件”非常用户友好。在大多数情况下,搜索 dll 不是性能问题,因为它只在程序启动时完成一次。

我觉得你的设计还可以。

于 2011-01-20T14:29:51.230 回答