MEF没有再次加载引用

时间:2012-03-26 14:21:51

标签: c# mef altova

我有一个如下界面:

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

1 个答案:

答案 0 :(得分:0)

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

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