MEF在其他组件中找不到零件

时间:2010-03-26 20:12:53

标签: .net mef

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

2 个答案:

答案 0 :(得分:9)

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

尝试替换它:

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

由此:

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

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

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

1 实际上,程序集可以包含多个文件,但很少使用。该术语也用于并排COM。

答案 1 :(得分:3)

是。您需要确保在合成之前将程序集(具有导入和导出的程序集)添加到目录中。这样,它就可以找到合适的部件。

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

让您的测试明确地将库项目添加到目录中,它很可能会按预期工作。