在解决方案中使用MEF和多个项目

时间:2010-10-02 10:54:47

标签: c# .net c#-4.0 mef

我有一个具有以下结构的解决方案:

  

解决方案

     
    

Main Exe

         

实用程序

  

当我在Utilities项目中使用MEF时,我发现以下两个MEF目录都没有选择Main Exe中保存的类型

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

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

我假设第一个失败,因为它在实用程序项目中被调用,而第二个失败,因为主项目中的类型存储在EXE而不是DLL ...

获取Mef目录的正确方法是什么,该目录可以在解决方案的所有项目中找到所有类型?

2 个答案:

答案 0 :(得分:3)

Just Spotted Assembly.GetEntryAssembly()以便以下工作

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

虽然它没有加载解决方案中的其他类型 - 一个选项是使用目录目录,虽然我想知道是否有某种方法可以避免使用它,因为它提出了引入第三方类型的可能性,我不会立即想要他们?

答案 1 :(得分:3)

在我的项目中,我只是在后期构建事件中添加一个命令,该命令将输出复制到主app bin目录中:

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

然后我只从根目录路径加载:

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