我需要使用一个接口(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的新手,无法弄清楚如何让它发挥作用。
假面
答案 0 :(得分:1)
您不需要两个容器来执行此操作。一个就够了。为此,您需要使用同时包含AssemblyCatalogs
。{/ p>的AggregateCatalog
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
,您可以将多个目录添加到容器中,这是您实际需要的。几乎在任何情况下,单个容器就足够了。