我有一个界面如下:
[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))。
对于项目A:
namespace ProjectXYZ
{
public classA{...}
}
对于项目B:
namespace ProjectXYZ
{
public classA{...}
public classB{...}
}
ProjectA.Transform 使用 ProjectXYZ.ClassA,而 ProjectB.Transform 使用 ProjectXYZ 的另一个实现中的 ProjectXYZ.ClassB。ProjectXYZ 的实现和类因 ITransform 的不同实现而异。ProjectXYZ中的类是通过一些第三方工具自动生成的,我需要直接使用。因此,我无法对 ProjectXYZ 进行任何更改。
因此,当 MEF 第一次加载 ProjectA.Transform 时,它还会加载 ProjectXYZ 以用作 ProjectA 的参考。当 ProjectB.Transform 正在加载/导出时,由于 ProjectXYZ 已经在 MEF 内存中,它使用 ProjectA 提供的 ProjectXYZ 引用。因此,当 ProjectB.Transform 正在执行时,它会搜索 ProjectXYZ.ClassB,但由于 MEF 已加载 ProjectA 中可用的 ProjectXYZ 引用,因此它没有得到它。
如何解决这个问题。MEF 正确加载部件,但它没有以所需的方式加载支持 dll 的引用。我也尝试过 PartCreationPolicy 属性,但结果是一样的。