Обнаружение сборки MEF во время выполнения - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть каталог со многими .dll, некоторые из которых являются плагинами MEF, которые я загружаю с помощью DirectoryCatalog - например:

var catalog = new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));

Загружает в каталог все сборки в каталоге исполняющих хостов. Однако я хочу создать только каталог сборок MEF (т.е. составных деталей).

Есть ли способ обнаружить сборки MEF?

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Эти сборки без деталей MEF не влияют на DirectoryCatalog.Parts, поэтому MEF уже обнаруживает вас.

Если вы чувствуете, что влияние на производительность сканирования всех сборок на наличие деталей MEF слишком велико, вы можете использовать шаблон поиска для фильтрации по имени DLL, например:

var catalog = new DirectoryCatalog(
    Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
    "*.plugins.dll");
1 голос
/ 17 января 2013

Вот класс, который вы можете просто включить и использовать для решения проблемы ReflectionTypeLoadException.

using System;
using System.ComponentModel.Composition.Hosting;
using System.IO;
using System.Linq;
using System.Reflection;

namespace Your.Namespace
{
    public class SafeDirectoryCatalog : AggregateCatalog
    {
        public SafeDirectoryCatalog(string folderLocation)
        {
            var di = new DirectoryInfo(folderLocation);

            if (!di.Exists) throw new Exception("Folder not exists: " + di.FullName);

            var dlls = di.GetFileSystemInfos("*.dll");

            foreach (var fi in dlls)
            {
                try
                {
                    var ac = new AssemblyCatalog(Assembly.LoadFile(fi.FullName));
                    var parts = ac.Parts.ToArray(); // throws ReflectionTypeLoadException 
                    this.Catalogs.Add(ac);
                }
                catch (ReflectionTypeLoadException ex)
                {
                    //Swallow this exception
                }
            }
        }
    }
}
...