CodeGo.net>如何使用MEF(托管扩展框架)从目录中加载DLL

我目前正在与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过滤单个零件定义.

上一篇:C#-将程序集转换为字节[]


下一篇:c#-JPG,DOC,PDF等文件也被编译成程序集吗?