ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-12-10 17:08:05  阅读:320  来源: 互联网

标签:mef assemblies c net


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

标签:mef,assemblies,c,net
来源: https://codeday.me/bug/20191210/2103047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有