У меня есть следующий интерфейс:
[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, но результаты такие же.