Как плагины могут быть загружены динамически и по требованию в MEF? - PullRequest
2 голосов
/ 21 февраля 2020

Когда наше приложение работает, мы хотим, чтобы оно время от времени запрашивало новые плагины и загружало их, если оно обнаруживало. Мы не просто хотим, чтобы плагины загружались при запуске. Это возможно с MEF? Мы сделали это уже с отражением, но MEF предоставляет хорошую структуру плагинов, и мы хотели бы использовать его, если это возможно.

1 Ответ

2 голосов
/ 25 февраля 2020

Вы можете сделать это с помощью DirectoryCatalog класса , который сканирует все сборки DLL в папке. Он также имеет метод Refre sh , который будет повторно сканировать каталог и обновлять sh контейнер, если найдены изменения. Это вызовет событие ExportsChanged в контейнере, которое также содержит информацию о произошедших изменениях.

Вот очень простой c пример, демонстрирующий, как это сделать:

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