2012-03-26 18 views
1

Laden habe ich eine Schnittstelle wie folgt:MEF kein Referenzen wieder

[InheritedExport(typeof(ITransform))] 
public interface ITransform 
{...} 

Jetzt habe ich zwei Klassen:

namespace ProjectA 
{ 
    public class Transform:ITransform {....} 
} 

Und

namespace ProjectB 
{ 
    public class Transform:ITransform {....} 
} 

ich verwende DirectoryCatalog für Laden jeder Teile. Jedes Projekt wird kompiliert, und der Speicherort der Binärdateien (Build-Ausgabe) wird DirectoryCatalog als Eingabe für die weitere Komposition gegeben.

Der Code für ITransform Teile holen ist wie folgt:

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(); 
     }   
    } 

Ich habe ein anderes Projekt ProjectXYZ (automatisch von Drittanbieter-Tool (Altova MapForce 2012 SP1)).

Für ProjectA:

namespace ProjectXYZ 
{ 
    public classA{...} 
} 

Für ProjectB:

namespace ProjectXYZ 
{ 
    public classA{...} 
    public classB{...} 
} 

ProjectA.Transform ProjectXYZ.ClassA verwendet, während ProjectB.Transform verwendet ProjectXYZ.ClassB aus einer anderen Implementierung ProjectXYZ. Die Implementierung und Klassen von ProjectXYZ variieren für verschiedene Implementierungen von ITransform. Die Klassen in ProjectXYZ werden automatisch durch einige Tools von Drittanbietern generiert, die ich direkt verwenden muss. Daher kann ich an ProjectXYZ keine Änderungen vornehmen.

Wenn also zum ersten Mal MEF ProjectA.Transform lädt, lädt es auch ProjectXYZ, das als Referenz für ProjectA verwendet werden soll. Wenn ProjectB.Transform geladen/exportiert wird und ProjectXYZ sich bereits im MEF-Speicher befindet, verwendet es die ProjectXYZ-Referenz, die von ProjectA verfügbar ist. Wenn ProjectB.Transform ausgeführt wird, sucht es daher nach ProjectXYZ.ClassB, die es nicht erhält, da MEF die ProjectXYZ-Referenz geladen hat, die in ProjectA verfügbar ist.

So beheben Sie dieses Problem. Das MEF lädt die Teile korrekt, aber es lädt die Referenzen der unterstützenden DLL nicht in einer gewünschten Weise. Ich habe auch PartCreationPolicy-Attribut versucht, aber die Ergebnisse sind gleich.

Antwort

0

Es ist kein MEF-Problem. Das Problem liegt im Lademodell von .NET. (oder besser, wie Ihre Objekte von .net geladen werden)

Wenn MEF lädt, gibt es die richtigen Objekte zurück. Bei der Suche nach der Klasse ProjectXYZ, wenn ProjektB geladen wird, ist bereits eine ProjectXYZ-DLL geladen, die mit dem korrekten Assemblynamen geladen ist, auf den sich projectB bezieht. Und der Lader die DLL tatsächlich referenziert von ProjectB ist nicht geladen.