MEF не загружает ссылки снова - PullRequest
1 голос
/ 26 марта 2012

У меня есть следующий интерфейс:

[InheritedExport(typeof(ITransform))]
public interface ITransform
{...}

Теперь у меня есть два класса:

namespace ProjectA
{
    public class Transform:ITransform {....}
}

И

namespace ProjectB
{
    public class Transform:ITransform {....}
}

Я использую DirectoryCatalog для загрузки каждой части.Каждый проект компилируется, и местоположение его двоичных файлов (вывод сборки) задается в качестве входных данных для DirectoryCatalog для дальнейшей компоновки.

Код для извлечения частей ITransform выглядит следующим образом:

public static class ExtensionFactory
    {        
        public static ITransform GetExtension(string extensionPath)
        {            
            IEnumerable<ITransform> extensions = null;          
            try
            {                
                AggregateCatalog catalog = new AggregateCatalog();
                catalog.Catalogs.Add(new DirectoryCatalog(extensionPath));      
                CompositionContainer container = new CompositionContainer(catalog);
                container.ComposeParts(catalog);
                extensions = container.GetExportedValues<ITransform>();
                return extensions.FirstOrDefault();
            }
            catch (Exception ex) {........}
            return extensions.FirstOrDefault(); 
        }        
    }

У меня естьдругой проект ProjectXYZ (автоматически создается сторонним инструментом (Altova Mapforce 2012 SP1)).

Для ProjectA:

namespace ProjectXYZ 
{
    public classA{...}
}

Для ProjectB:

namespace ProjectXYZ 
{
    public classA{...}
    public classB{...}
}

ProjectA.Transform использует ProjectXYZ.ClassA, тогда как ProjectB.Transform использует ProjectXYZ.ClassB из другой реализации ProjectXYZ.Реализация и классы ProjectXYZ различаются для разных реализаций ITransform.Классы в ProjectXYZ автоматически генерируются с помощью сторонних инструментов, которые мне нужно использовать напрямую.Поэтому я не могу вносить какие-либо изменения в ProjectXYZ.

Поэтому, когда MEF впервые загружает ProjectA.Transform, он также загружает ProjectXYZ для использования в качестве ссылки для ProjectA.Когда ProjectB.Transform загружается / экспортируется, тогда, когда ProjectXYZ уже находится в памяти MEF, он использует ссылку ProjectXYZ, доступную от ProjectA.Таким образом, когда выполняется ProjectB.Transform, он ищет ProjectXYZ.ClassB, который он не получает, поскольку MEF имеет загруженную ссылку ProjectXYZ, доступную в ProjectA.

Как решить эту проблему.MEF загружает части правильно, но он не загружает ссылки на вспомогательные DLL желаемым образом.Я также пробовал атрибут PartCreationPolicy, но результаты такие же.

1 Ответ

0 голосов
/ 29 марта 2012

Это не проблема MEF. Проблема в загрузочной модели .NET. (или лучше то, как вы загружаете объекты в .net)

Когда MEF загружается, он возвращает правильные объекты. Но при поиске класса ProjectXYZ при загрузке projectB уже есть dll ProjectXYZ, загруженная с правильным именем сборки, на которое ссылается projectB. И загрузчик dll, на который фактически ссылается projectB, не загружается.

...