MEF рекурсивный поиск плагинов - PullRequest
14 голосов
/ 15 ноября 2011

Допустим, у меня есть несколько приложений в папке (у каждого приложения есть подпапки, в которых могут находиться плагины):

  • Клиенты
    • Приложение А
      • ...
    • Приложение B
      • ...
    • Приложение C
      • ...
    • ...

К некоторым файлам в этих приложениях применен атрибут Export, а к другим нет. Теперь я хочу иметь возможность загружать эти плагины в некоторые из этих приложений. Есть ли правильный способ позволить MEF выполнять рекурсивный поиск в каждой подпапке указанной папки?

Ответы [ 4 ]

17 голосов
/ 15 ноября 2011

Нет, вам придется самостоятельно просматривать каталоги, создавая DirectoryCatalog для каждого. Затем объедините все DirectoryCatalog с AggregateCatalog, чтобы создать контейнер.

2 голосов
/ 09 апреля 2015

Другой способ - получить все файлы DLL в указанном каталоге (рекурсивно) и загрузить их один за другим, используя каталог сборок.

var catalog = new AggregateCatalog();

        var files = Directory.GetFiles("Parent Directory", "*.dll", SearchOption.AllDirectories);

        foreach (var dllFile in files)
        {

            try
            {
                var assembly = Assembly.LoadFile(dllFile);
                var assemblyCatalog = new AssemblyCatalog(assembly);
                catalog.Catalogs.Add(assemblyCatalog);
            }
            catch (Exception e)
            {
               // this happens if the given dll file is not  a .NET framework file or corrupted.

            }
        }
1 голос
/ 15 апреля 2016

Я создал реализацию, основанную на Николас Блумхардт ответ, я надеюсь, что код поможет другим в будущем.

private void RecursivedMefPluginLoader(AggregateCatalog catalog, string path)
{
    Queue<string> directories = new Queue<string>();
    directories.Enqueue(path);
    while (directories.Count > 0)
    {
        var directory = directories.Dequeue();
        //Load plugins in this folder
        var directoryCatalog = new DirectoryCatalog(directory);
        catalog.Catalogs.Add(directoryCatalog);

        //Add subDirectories to the queue
        var subDirectories = Directory.GetDirectories(directory);
        foreach (string subDirectory in subDirectories)
        {
            directories.Enqueue(subDirectory);
        }
    }
}
1 голос
/ 01 июля 2014

Доступен проект MEFContrib, у которого есть RecursiveDirectoryCatalog именно для этой цели ...

https://www.nuget.org/packages/MefContrib/

...