我是插件世界的新手,不得不理解 mef。目前我知道如何从特定文件夹加载插件。现在我有一些问题:
- 我可以从配置文件(序列化)中指定的文件夹加载插件吗?
- 我如何卸载插件?
- 如何在最小和最大版本之间加载特定版本的插件?
- 我如何包装目录并撰写例如“MEF Manager”之类的东西
可选:
- 我如何显示插件中的表单?
感谢帮助
我可以从配置文件(序列化)中指定的文件夹加载插件吗?
是的,您可以使用 MEF 的DirectoryCatalog类从文件夹加载插件。不过,您必须在配置文件中添加自己的部分,并DirectoryCatalog
为插件所在的每个文件夹创建一个。Unraveling the Mysteries of .NET 2.0 Configuration包含有关如何使用System.Configuration
命名空间中的类的重要信息。
我如何卸载插件?
这取决于卸载插件的含义。
从文件夹中删除程序集时卸载插件可以使用AllowRecomposition
MEF 的导入属性的属性和每个插件文件夹的FileSystemWatcher来监视已删除的 .dll 文件并调用该DirectoryCatalog.Refresh
方法以强制更新 MEF 容器。请注意,默认情况下您不能删除由 .NET 加载的程序集。为了克服这个问题,.NET 支持Shadow Copying。查看 Glenn Block 的The Way of MEF代码。这PartUpdatesInPlace
是如何做到这一点的一个很好的例子。
在没有文件系统的情况下卸载插件是另一回事。你必须自己做这件事。通常你需要一个可以随意卸载插件的插件管理器。
请注意,加载的程序集不会仅卸载插件。
如何在最小和最大版本之间加载特定版本的插件?
您可以使用 MEF 的导出元数据来添加插件元数据。然后您使用 CompisitionContainer 的GetExports方法并在访问实际插件之前检查元数据。这是基于 MEF 的插件解决方案的标准程序。另请查看在 MEF2 中添加的ExportFactory类以获得更好的方法。
我如何包装目录并撰写例如“MEF Manager”之类的东西
从一个非常简单的插件管理器类开始,它提供了基础知识(取决于你想要做什么)并以此为基础构建。
我如何显示插件中的表单?
您可以采用与没有 MEF 的情况相同的方式进行操作。例如,您可以将表单属性添加到插件接口/基类,并让每个插件负责创建/处理它。
在开始执行所有这些操作之前,我建议您检查Prism
(复合应用程序指南)和Smart Client Software Factory
. 这些是需要极大灵活性的 WPF 和 WinForms 应用程序的强大框架。如果您决定检查它们,我认为最好的方法是使用样品。
祝你好运