我有一个界面如下:MEF不加载引用再次
[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.ClassB从ProjectXYZ的另一种实现方式。对于不同的ITransform实现,ProjectXYZ的实现和类会有所不同。 ProjectXYZ中的类是通过一些第三方工具自动生成的,我需要直接使用它们。所以,我无法对ProjectXYZ进行任何更改。
所以,当第一次MEF加载ProjectA.Transform时,它也加载ProjectXYZ作为ProjectA的参考。当ProjectB.Transform被加载/导出时,则由于ProjectXYZ已经在MEF内存中,它使用ProjectA提供的ProjectXYZ参考。因此,当ProjectB.Transform执行时,它将搜索ProjectXYZ.ClassB,它不会像MEF加载ProjectA中可用的ProjectXYZ参考那样获取它。
如何解决此问题。 MEF正确加载部件,但不会以期望的方式加载支持dll的引用。我也尝试过PartCreationPolicy属性,但结果是一样的。