MEF 导入对我不起作用,但容器按预期工作

MEF Import not working for me, but container works as expected

我有以下非常结构: 我有一个主机 class,它创建目录和容器并使用 [ImportMany] 从目录中的 dll 导入 class。目录和容器都包含正确的 class,但我尝试用 ImportMany 填充的可枚举项仍为空。 我将我的问题与 10 多个类似案例进行了比较,但 none 我找到的解决方案对我有所帮助。 我忽略了什么?

这是 HostClass,它只是从 Program.Main() 实例化并调用 DoStuff()。

public class HostClass
{ 
    private CompositionContainer _container;

    [ImportMany]
    public IEnumerable<Lazy<IOperation, IOperationData>> operations;

    public HostClass()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        catalog.Catalogs.Add(new DirectoryCatalog(@"Path/to/Folder"));

        _container = new CompositionContainer(catalog);

        CompositionBatch batch = new CompositionBatch(); // Found as answer to a similar problem, but did not help in my case
        batch.AddExportedValue(this._container);

        try
        {
            this._container.Compose(batch);
            this._container.ComposeParts(this);
            this._container.SatisfyImportsOnce(this);  // // Found as answer to a similar problem, but did not help in my case
        }
        catch (CompositionException compositionException)
        {
            Console.WriteLine(compositionException.ToString());
        }
    }

    public void DoStuff()
    { // Stuff with operations}

应该导出的class:

[Export(typeof(IOperation))]
[ExportMetadata("Type", "myType")]
class Operation: IOperation
{ // Stuff }

Host 命名空间和导出的 dll 的命名空间都包含它们自己的接口 IOperation,但是当我玩微软自己的 MEF 教程时,这似乎不是问题。为了避免这方面的任何问题,我确实尝试在两边都使用 Import/Export("Teststring") ,但这也没有帮助。 此外,当我在调试器中逐步将其与根据我的结构调整的 MS 教程进行比较时,唯一的区别是,枚举在教程中的 this._container.ComposeParts(this); 之后被填充,而它变为空(但不是 null,至少)在我的实际应用中

谢谢!

通过为公共接口使用单独的程序集解决了这个问题。

错误似乎确实出现在我用来比较行为的示例项目中,即使据我所知它们在主机和导出之间没有引用 - 我只是注意到行为没有在手动将示例中的所有 类 移动到我的应用程序后重现。