MEF没有再次加载引用
本文关键字:加载 引用 MEF | 更新日期: 2023-09-27 18:29:12
我有一个如下的接口:
[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属性,但结果是一样的。
这不是MEF问题。问题出在.NET的加载模型中
MEF加载时会返回正确的对象。但是,当加载projectB时查找类ProjectXYZ时,已经有一个加载了projectB所引用的正确程序集名称的ProjectXYZ dll。并且没有加载projectB实际引用的dll的加载程序。