2012-03-26 62 views
1

我有一个界面如下:MEF不加载引用再次

[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.ClassB从ProjectXYZ的另一种实现方式。对于不同的ITransform实现,ProjectXYZ的实现和类会有所不同。 ProjectXYZ中的类是通过一些第三方工具自动生成的,我需要直接使用它们。所以,我无法对ProjectXYZ进行任何更改。

所以,当第一次MEF加载ProjectA.Transform时,它也加载ProjectXYZ作为ProjectA的参考。当ProjectB.Transform被加载/导出时,则由于ProjectXYZ已经在MEF内存中,它使用ProjectA提供的ProjectXYZ参考。因此,当ProjectB.Transform执行时,它将搜索ProjectXYZ.ClassB,它不会像MEF加载ProjectA中可用的ProjectXYZ参考那样获取它。

如何解决此问题。 MEF正确加载部件,但不会以期望的方式加载支持dll的引用。我也尝试过PartCreationPolicy属性,但结果是一样的。

回答

0

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

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