C# 如何在MEF中按需动态加载插件?

C# 如何在MEF中按需动态加载插件?,c#,.net,reflection,mef,C#,.net,Reflection,Mef,当我们的应用程序运行时,我们希望它偶尔轮询新插件,并在发现任何插件时加载它们。我们不仅仅希望在启动时加载插件。这在MEF中是可能的吗?我们已经用反射完成了,但是MEF提供了一个很好的插件框架,如果可能的话,我们希望使用它。您可以使用扫描文件夹中所有dll程序集的。它还具有一个重新扫描目录并在发现更改时刷新容器的功能。这将触发容器中的,其中还包含关于发生了哪些更改的信息 下面是一个非常基本的示例,演示了如何执行此操作: class Program { static void Main(str

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

您可以使用扫描文件夹中所有dll程序集的。它还具有一个重新扫描目录并在发现更改时刷新容器的功能。这将触发容器中的,其中还包含关于发生了哪些更改的信息

下面是一个非常基本的示例,演示了如何执行此操作:

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));
   }
}

看看是否有帮助。谢谢@sthotakura。我想知道我是否可以动态加载它们,而不仅仅是在启动时。谢谢@alsd。您知道它对加载同一dll的较新版本有何反应吗?我不工作,因为它是同一命名空间。如果您设法删除上一个程序集,它可能会起作用。在我的示例中,我无法删除该文件,因为它被锁定。有关更多详细信息,请查看以下链接。