我目前正在与MEF合作,并且遇到一些问题
我想要的是从目录加载dll.
首先,我扫描目录并将两件事保存在字典中
来自各个DLL的Name属性(作为字符串)
和模块名称(作为字符串)
这是ScanDirectory()代码
private void ScanPluginDirectory()
{
catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog(@"..\..\plugin"));
container = new CompositionContainer(catalog);
batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
pluginDictionary = new Dictionary<String, String>();
foreach (IFilter filter in filters)
{
Type t = filter.GetType();
pluginDictionary.Add(filter.Name, t.Module.Name);
}
}
并在复选框列表中显示其名称.从复选框中选择dll后.
我有进口声明为
[Import]
public IEnumerable<IFilter> filters { get; set; }
目前,我的程序运行良好.我所做的是当我从复选框列表中检查插件时.它将其移动到“已加载”目录中,然后它们的QueryPlugin()方法将查找“已加载”目录中以搜索插件.
从复选框列表中取消选中插件时.我将其移出“已加载”目录…
我想要的是使用batch.RemovePart()方法来摆脱dll从一个目录到另一个目录的快速移动.
注意:我不是使用以下方式手动将插件添加到批处理中
batch.AddPart(new DemoFilter1());
代替这个,我使用DirectoryCatalog();;
解决方法:
代替使用DirectoryCatalog,使用AggregateCatalog并将目录中每个程序集的AssemblyCatalog添加到聚合目录中.然后,当选中或取消选中插件时,可以将相应的AssemblyCatalog添加或删除到AggregateCatalog中.
请注意,如果给定程序集中有多个插件,则此方法可能会出现问题.一种更可靠的方法是使用filtered catalog过滤单个零件定义.