【问题标题】:How can plugins be loaded dynamically and on-demand in MEF?如何在 MEF 中动态和按需加载插件?
【发布时间】:2020-02-21 20:57:15
【问题描述】:

当我们的应用程序运行时,我们希望它偶尔轮询新插件并在找到时加载它们。我们不只是希望在启动时加载插件。 MEF可以做到这一点吗?我们已经用反射完成了它,但是 MEF 提供了一个很好的插件框架,如果可能的话,我们希望使用它。

【问题讨论】:

  • 看看this是否有帮助。
  • 谢谢@sthotakura。我想知道我是否可以动态加载它们......不仅仅是在启动时。

标签: c# .net reflection mef


【解决方案1】:

您可以使用扫描文件夹中所有 dll 程序集的DirectoryCatalog class 来执行此操作。它还有一个Refresh method,如果发现更改,它将重新扫描目录并刷新容器。这将触发容器中的ExportsChanged event,其中还包含有关已发生更改的信息。

这是一个非常基本的示例,演示了如何做到这一点:

class Program
{
   static void Main(string[] args)
   {
      DirectoryCatalog catalog = new DirectoryCatalog("plugins", "*.dll");
      CompositionContainer container = new CompositionContainer(catalog);
      container.ExportsChanged += Container_ExportsChanged;
      Console.WriteLine("Copy new plugins and press any key to refresh them.");
      Console.ReadKey();
      catalog.Refresh();
      Console.ReadLine();
   }

   private static void Container_ExportsChanged(object sender, ExportsChangeEventArgs e)
   {
      Console.Write("Added Exports: ");
      Console.WriteLine(string.Join(", ", e.AddedExports));
   }
}

【讨论】:

  • 谢谢@AlesD。你知道它对加载相同 dll 的新版本有何反应吗?
  • 我不工作,因为它是同一个命名空间。如果您设法删除以前的程序集,它可能会起作用。在我的示例中,我无法删除该文件,因为它已被锁定。检查以下链接以获取更多详细信息。 Unloading a dll file in mefMEF and AppDomain - Remove Assemblies On The Fly
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 2011-06-23
  • 2012-01-07
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多