MEF无法在其他程序集中找到部件。

6

在使用MEF时,我似乎缺少一些基础知识。我通过示例和一个简单的控制台应用程序使其工作,在这个应用程序中,所有内容都在同一个程序集中。然后,我将一些导入和导出放在了一个包含各种实体的单独项目中。我想在MS测试中使用这些实体,但是组合从未真正完成。当我将组合内容移动到相关实体的构造函数中时,它可以工作,但显然这是错误的。GetExecutingAssembly只能“看到”测试过程吗?关于容器,我错过了什么?我尝试在测试中使用Using来放置容器,但没有成功。MEF文档仍然非常缺乏,我找不到一个简单的应用程序(或MS测试),其中使用了来自不同项目的实体...

2个回答

8
在.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。


3
是的。您需要确保在组合之前将您的程序集(具有导入和导出功能的程序集)添加到目录中。这样,它就可以找到适当的部件。
GetExecutingAssembly恰好做了它所说的 - 它获取当前正在执行的程序集,这意味着具有特定代码编写的那个程序集。在您的情况下,这是测试程序集,而不是您的“库”项目。
让您的测试显式地将库项目添加到目录中,它很可能会按您的预期工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接