我目前正在与MEF合作并面临一些问题
我想要的是从目录加载dll。
首先我扫描目录并在字典中保存两件东西
各个DLL的名称属性(作为字符串)
和模块名称(作为字符串)
这是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();;
答案 0 :(得分:3)
使用AggregateCatalog而不是使用DirectoryCatalog,并将目录中每个程序集的AssemblyCatalog添加到聚合目录。然后,当选中或取消选中插件时,您可以将相应的AssemblyCatalog添加或删除到AggregateCatalog。
请注意,如果给定程序集中有多个插件,则此方法可能存在问题。更强大的方法可以使用filtered catalog过滤单个零件定义。