我有一个如下界面:
[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的另一个实现中的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属性,但结果是一样的。
答案 0 :(得分:0)
这不是MEF问题。问题出在.NET的加载模型中。 (或者更好的是你的对象被.net加载的方式)
当MEF加载时,它返回正确的对象。但是当在加载projectB时查找类ProjectXYZ时,已经有一个ProjectXYZ dll加载了projectB引用的正确程序集名称。并且没有加载projectB实际引用的dll加载器。