如何使用MEF(托管扩展框架)从目录加载dll

时间:2009-05-18 05:11:54

标签: c# .net assemblies mef

我目前正在与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();;

1 个答案:

答案 0 :(得分:3)

使用AggregateCatalog而不是使用DirectoryCatalog,并将目录中每个程序集的AssemblyCatalog添加到聚合目录。然后,当选中或取消选中插件时,您可以将相应的AssemblyCatalog添加或删除到AggregateCatalog。

请注意,如果给定程序集中有多个插件,则此方法可能存在问题。更强大的方法可以使用filtered catalog过滤单个零件定义。