Ответ 1
Нет, вам нужно будет пройти через каталоги, самостоятельно создавая DirectoryCatalog
для каждого. Затем соедините все DirectoryCatalog
с AggregateCatalog
, чтобы создать контейнер.
Скажем, что у меня есть несколько приложений в папке (у каждого приложения есть подпапки, где могут находиться плагины):
Некоторые файлы в этих приложениях имеют атрибут Export-атрибут, другие - нет. Теперь я хочу иметь возможность загружать эти плагины в некоторых из этих приложений. Есть ли способ разрешить поиск MEF рекурсивно в каждой подпапке определенной папки?
Нет, вам нужно будет пройти через каталоги, самостоятельно создавая DirectoryCatalog
для каждого. Затем соедините все DirectoryCatalog
с AggregateCatalog
, чтобы создать контейнер.
Другой способ - получить все файлы 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.
}
}
Там доступен проект MEFContrib, который имеет рекурсивный каталог для этой цели...
Я создал реализацию, основанную на ответе Николаса Блумхардта, надеюсь, что код поможет другим в будущем.
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);
}
}
}