2010-03-26 29 views
7

在使用MEF时我缺少一些基本的东西。我使用示例和一个简单的控制台应用程序,其中的一切都在同一个程序集中。然后,我将一些进口和出口放在一个包含各种实体的单独项目中。我想在MS Test中使用这些实体,但实际上从未完成组合。当我将合成内容移入有问题的实体的构造函数中时,它可以工作,但这显然是错误的。 GetExecutingAssembly只是“看”测试过程吗?我错过了什么容器?我试图把容器放在测试中,但没有运气。 MEF文档仍然非常少,我找不到一个应用程序(或MS测试)的简单示例,它使用来自不同项目的实体...MEF在其他程序集中找不到零件

回答

9

在.NET中,每个exe或DLL文件都称为程序集。因此,当您基于“正在执行的程序集”构建目录并在应用程序入口点使用该目录时,则只包含在exe项目中定义的部分。您不会在DLL中定义任何部分。

尝试更换此:

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 

本:

var catalog = new AggregateCatalog(
    new ComposablePartCatalog[] 
    { 
     new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
     new DirectoryCatalog(".") 
    }); 

编辑:我刚刚发现,有一个简单的解决方案:

var catalog = new DirectoryCatalog(".", "*"); 

( )其实,程序集可以由多个文件组成,但很少使用。该术语也用于并排COM。

3

是的。您需要确保在合成之前将您的装配(具有导入和导出的装配)添加到目录。这样,它可以找到适当的部分。

GetExecutingAssembly正是它所说的 - 它获取当前正在执行的程序集,这意味着具有该特定代码的程序集。在你的情况下,这是测试程序集,而不是你的“库”项目。

您的测试是否明确将库项目添加到目录中,并且它很可能会按照您的预期工作。

相关问题