2010-11-05 4 views
1

Disons que j'ai une solution avec 4 projets:« Impossible de charger un ou plusieurs des types demandés » tout en utilisant un contrat dans un projet distinct

  1. Namespace.Contracts - contient l'interface IContract
  2. Namespace. Plugin.A - contient une implémentation de classe A - IContract. Classe A est exporté à l'aide
  3. MEF Namespace.App - application qui importe les classes IContract de différents endroits, y compris l'assemblage de Plugin.A

Je reçois « Impossible de charger un ou plusieurs des types demandés » exception d'exécution lors de la composition dans le projet 3 - MEF se plaint que le type IContract ne peut pas être trouvé dans Namspace.App ... pourquoi le cherche-t-il dans cet espace de noms et non Namespace.Contracts? Si je déplace l'espace de noms IContract vers le projet Namespace.App, cela fonctionne ... qu'est-ce qui me manque? Comment devrais-je composer les pièces?

Répondre

2

Ce ReflectionTypeLoadException est ce que vous obtenez lorsque votre assembly fait référence à un type qui n'existe pas. Ce n'est pas spécifique au MEF; vous verrez la même exception si vous chargez l'assemblage gênant et énumérez ses types comme ceci:

var assembly = Assembly.Load("trouble.dll"); 
assembly.GetTypes(); 

Dans votre cas, vous avez à un moment donné compilé un ensemble de plug-in qui fait référence au type Namespace.App.IContract. Vous avez ensuite copié cet assembly dans le dossier bin de l'application où il pourrait être récupéré par MEF.

Plus tard, vous avez déplacé l'interface IContract vers un autre assembly Namespace.Contracts - mais l'ancien assembly de plugin attend toujours ce type à son emplacement précédent. Vous devez recompiler l'assembly de plug-in et le redéployer.

0

Etes-vous sûr d'avoir ajouté tous les assemblages au conteneur MEF avant le chargement? Veuillez afficher le code que vous utilisez pour composer. devrait ressembler à quelque chose comme ceci pour charger tous les assemblages dans un répertoire:

var catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new DirectoryCatalog(@".\")); 

J'utilise cette méthode pour charger MEF:

private bool Load(IEnumerable<string> addinDirectories) 
{ 
    var catalog = new AggregateCatalog(); 
    catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly())); 
    foreach (string dir in addinDirectories) 
    { 
     DirectoryCatalog dc = new DirectoryCatalog(dir); 
     catalog.Catalogs.Add(dc); 
    } 
    this.container = new CompositionContainer(catalog); 

    CompositionBatch batch = new CompositionBatch(); 
    batch.AddPart(this); 
    batch.AddExportedValue(container); 

    this.container.Compose(batch); 

    return this.success; 
} 

L'entrée est tous les répertoires où mes ensembles sont MEF emplacement , incl. le répertoire d'exécution.

+0

L'échec de l'ajout d'un assembly au conteneur ne provoque pas l'erreur ReflectionTypeLoadException décrite. C'est un autre type d'échec. –

+0

Notez également que votre méthode ne détectera pas les assemblages dans le répertoire des exécutables autres que l'exe lui-même (sauf si vous avez "." Dans "addinDirectories"). –

+0

@Wim, c'est ce que j'ai écrit dans la dernière ligne, le répertoire d'exécution. Et c'est l'erreur que j'obtiens normalement, quand MEF ne peut pas trouver une exportation requise. –

Questions connexes