2

我是插件世界的新手,不得不理解 mef。目前我知道如何从特定文件夹加载插件。现在我有一些问题:

  • 我可以从配置文件(序列化)中指定的文件夹加载插件吗?
  • 我如何卸载插件?
  • 如何在最小和最大版本之间加载特定版本的插件?
  • 我如何包装目录并撰写例如“MEF Manager”之类的东西

可选:

  • 我如何显示插件中的表单?

感谢帮助

4

1 回答 1

8

我可以从配置文件(序列化)中指定的文件夹加载插件吗?

是的,您可以使用 MEF 的DirectoryCatalog类从文件夹加载插件。不过,您必须在配置文件中添加自己的部分,并DirectoryCatalog为插件所在的每个文件夹创建一个。Unraveling the Mysteries of .NET 2.0 Configuration包含有关如何使用System.Configuration命名空间中的类的重要信息。

我如何卸载插件?

这取决于卸载插件的含义。

  • 从文件夹中删除程序集时卸载插件可以使用AllowRecompositionMEF 的导入属性的属性和每个插件文件夹的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 应用程序的强大框架。如果您决定检查它们,我认为最好的方法是使用样品。

祝你好运

于 2013-01-24T11:29:37.213 回答