Как работает каталог каталогов MEF? - PullRequest
6 голосов
/ 27 февраля 2012

DirectoryCatalog сканирует сборки в каталоге, чтобы определить, какие классы импортируются / экспортируются.Любые сборки без импорта / экспорта не загружаются.

Это потрясающая функция, но как она работает?Чтобы исследовать пользовательские атрибуты типов в сборке, вам не нужно загружать сборку?Как только он загружен, он не может быть выгружен, поэтому так не может быть.

Делает ли он какую-то магию AppDomain?

Ответы [ 2 ]

10 голосов
/ 27 февраля 2012

Попробуйте.DirectoryCatalog просто создает AssemblyCatalog для каждого файла .dll в данном каталоге.Поскольку AssemblyCatalog вызывает AssemblyName.GetAssemblyName, файлы не .NET .dll не будут загружены (исключение выдается и перехватывается в AssemblyCatalog).AssemblyCatalog вызывает Assembly.Load на AssemblyName, который он создал.Таким образом, сборки сразу загружаются при создании DirectoryCatalog.Нет магии, нет AppDomains.Но тогда хорошо известно, что MEF загружает сборки в текущий AppDomain.Используйте MAF , если вы хотите сборки, которые могут быть выгружены.

1 голос
/ 29 февраля 2012

это пример кода, который может вам помочь.

var directoryPath = "Dll folder path";

//Load parts from the available dlls in the specified path using the directory catalog
var directoryCatalog = new DirectoryCatalog(directoryPath, "*.dll");

//Creating an instance of aggregate catalog. It aggregates other catalogs
var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(directoryCatalog);

//Crete the composition container
var container = new CompositionContainer(aggregateCatalog);

container.ComposeParts(this);


[ImportMany]
public List<IModule> Modules { get; set; }
...