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没有再次加载引用

这不是MEF问题。问题出在.NET的加载模型中

MEF加载时会返回正确的对象。但是,当加载projectB时查找类ProjectXYZ时,已经有一个加载了projectB所引用的正确程序集名称的ProjectXYZ dll。并且没有加载projectB实际引用的dll的加载程序。