我有一个程序,我开发了一个使用基本插件架构的程序。实际上,当程序加载时,它使用反射在目录中搜索适合某个接口的 dll,然后加载它们。现在看来,当前的插件列表就是将要使用的所有插件。
因此,我目前检查 dll 文件的做法仍然是最佳做法,还是有更好的方法来加载每个 dll?
谢谢。
我有一个程序,我开发了一个使用基本插件架构的程序。实际上,当程序加载时,它使用反射在目录中搜索适合某个接口的 dll,然后加载它们。现在看来,当前的插件列表就是将要使用的所有插件。
因此,我目前检查 dll 文件的做法仍然是最佳做法,还是有更好的方法来加载每个 dll?
谢谢。
从您的问题来看,您似乎已经构建(或正在尝试构建)您自己的插件架构。这不是一个好主意,因为 .NET 已经拥有您正在寻找的东西。
.NET 提供了两种允许插件的方法。
(1) System.Addin - 我几乎没有听过/读过很多关于它的信息。但是您可以在这里查看一些文章:
来自 MSDN 杂志的 System.Addin 文章<- 请注意
Codeplex 的 2007 年 System.Addin 工具和示例
(2)现在,MEF,MEF 真是太棒了!它是一种将插件架构引入系统的简便方法。MEF 也是 Silverlight 的一部分,Visual Studio 2010 使用它。我可以看到您想动态加载带有插件的 dll,使用 MEF,您可以设计您的应用程序,使您与软件打包的类可以在您自己的程序集 (.exe) 中,然后您可以使用 MEF 动态查找将来会有你需要的类的dll。整个过程本身在 MEF 中非常简单。
Codeproject 上的 MEF 文章 - 第 1 部分 Codeproject 上的 MEF 文章 - 第 2 部分
我个人认为你应该使用 MEF,它的新的、简单的甚至 Visual Studio 都使用它,即使你可以看看:
在 MEF 和 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;
}
然后它就变成了即插即用的事情:)
参考MEF 是一个非常强大的用于创建插件设计的架构解决方案。
这很好。或者,您也可以定义要在配置文件中加载哪些程序集,如果您认为在所述文件夹中有大量 DLL 可能会影响您的应用程序并且可能存在一些安全问题,因为任何人都可能将 DLL 推送到该文件夹中。
对于您的场景,我建议使用 MEF 及其 DirectoryCatalog 从特定文件夹加载插件。如果您额外配置文件系统监视器并在文件夹更改时刷新 DirectoryCatalog,由于 MEF 的重组功能,您将能够在运行时拉取新插件!顺便说一句,你可以看到我为我的一次 MEF 演讲做的一个很好的重组样本。
我觉得你的设计还可以。