2010-10-02 6 views
0

j'ai une solution avec la structure suivante:utilisant MEF avec plusieurs projets dans une solution

Solution

principal Exe

Utilities

Quand je utiliser MEF dans le projet Utilities je trouve que ni les catalogues MEF suivants reprennent les types détenus dans le Main Exe

catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 

catalog.Catalogs.Add(new DirectoryCatalog(Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory))); 

Je suppose que le premier échoue comme étant appelée dans le projet des services publics, et que la seconde échoue depuis les types dans le projet principal sont stockés dans un fichier EXE et pas une DLL ...

quelle est la bonne façon d'obtenir un catalogue Mef qui trouve tous les types dans tous les projets d'une solution?

Répondre

3

Dans mes projets, je simplement mis une commande dans les événements post-construction, qui copie la sortie dans le répertoire principal bin apps:

XCOPY "$(ProjectDir)$(OutDir)*" "$(SolutionDir)MainApp\bin\*" /y 

Alors je viens de charger à partir du chemin du répertoire racine:

AggregateCatalog Catalog = new AggregateCatalog(); 
Catalog.Catalogs.Add(new DirectoryCatalog(root_directory_path, "My.Assemlies.*")); 
CompositionContainer Container = new CompositionContainer(Catalog); 
Container.ComposeParts(this); 
3

Juste Spotted Assembly.GetEntryAssembly() pour ce qui suit fonctionnera

AggregateCatalog catalog = new AggregateCatalog(); 
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetEntryAssembly())); 
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 

bien qu'il ne charge pas les autres types dans la solution - une option est d'utiliser un catalogue d'annuaires si je me demande s'il y a un certain façon d'éviter d'utiliser cela comme il soulève la possibilité d'introduire des types de tiers où je ne les veux pas immédiatement?

Questions connexes