1

我有一个界面如下:

[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 属性,但结果是一样的。

4

1 回答 1

0

这不是 MEF 问题。问题出在 .NET 的加载模型中。(或者更好的方式是你的对象由.net加载)

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

于 2012-03-29T12:06:38.253 回答