1

我需要使用一个接口 (IDataSender) 加载一个 DLL (Data) 并使用另一个接口 (IMessageSender) 加载另一个 DLL (Message)。下面的代码生成一个错误,即正在加载的 DLL 不支持来自其他 DLL 的接口。看起来每个 DLL 都支持 MEF 使用的所有接口。

知道如何使用不同的接口加载 DLL 吗?我尝试使用 [ImportMany] 但这似乎使用相同的接口加载多个 DLL。MEF 可以支持多个接口吗?

[Import(typeof(IDataSender))]
public IDataSender DataSender;

[Import(typeof(IMessageSender))]
public IMessageSender MessageSender;

catalog_data = new AssemblyCatalog(@".\ABC.Data.dll");
container_data = new CompositionContainer(catalog_data);
container_data.ComposeParts(this);

catalog_message = new AssemblyCatalog(@".\ABC.Message.dll");
container_message = new CompositionContainer(catalog_message);
container_message.ComposeParts(this);

// DLL 1
namespace ABC.Data 
{
    [Export(typeof(IDataSender))]
    public class DataClass : IDataSender
    {
    }
}

// DLL 2
namespace ABC.Message 
{
    [Export(typeof(IMessageSender))]
    public class MessageClass : IMessageSender
    {
    }
}

感谢您提供的任何帮助。我是 MEF 的新手,不知道如何让它发挥作用。

假面

4

1 回答 1

1

您不需要两个容器来执行此操作。一个就够了。为此,您需要使用同时包含AssemblyCatalogs.

catalog_data = new AssemblyCatalog(@".\ABC.Data.dll");   
catalog_message = new AssemblyCatalog(@".\ABC.Message.dll");
container = new CompositionContainer(new AggregateCatalog(catalog_data, catalog_message);
container.ComposeParts(this);

您的代码的问题是两个容器中没有一个包含满足导入所需的两个部分。每一个都包含一个必要的部分。使用 ,AggregateCatalog您可以将多个目录添加到容器中,这正是您真正需要的。几乎在任何情况下,一个容器就足够了。

于 2013-07-14T23:10:46.860 回答