MEF入门之不求甚解,但力求简单能讲明白
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MEF入门之不求甚解,但力求简单能讲明白相关的知识,希望对你有一定的参考价值。
在上一篇文章中,我们已经学到了很基本的MEF概念和使用方法。
但我们导出的是一个object类型的实例,只能用来tostring,没有引用部件类库,也不能用里面的成员方法。
本篇,我们逐渐往简单的文件管理器的目标靠拢。
新建类库IPart,添加一个接口IFileHandler.cs
namespace IPart { public interface IFileHandler { void Process(); } }
Parts类库和主项目meftest均引用IPart
Parts类库中,将要导出的类型改为IFileHandler,类实现IFileHandler
以其中一个为例。
using IPart; using System; using System.ComponentModel.Composition; namespace Parts { [Export(typeof(IFileHandler))]//表示此类需要导出,导出的类型为IFileHandler public class TxtFileHandler: IFileHandler { public void Process() { Console.WriteLine("处理文本文件"); } } }
主项目:
using IPart; using System; using System.ComponentModel.Composition.Hosting; namespace meftest { class Program { //容器,装东西用的。具体装什么先不管。 private static CompositionContainer container; static void Main(string[] args) { //AssemblyCatalog 目录的一种,表示在程序集中搜索 var assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);//此处这一句实际上没啥用,因为此程序集下没有任何我们需要的实例(各种handler) //在某个目录下的dll中搜索。 var directoryCatalog = new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory,"*.dll"); var aggregateCatalog = new AggregateCatalog(assemblyCatalog, directoryCatalog); //创建搜索到的部件,放到容器中。 container = new CompositionContainer(aggregateCatalog); var exports = container.GetExports<IFileHandler>();//获得所有导出的部件(IFileHandler类型的)。 foreach (var item in exports) { item.Value.Process();//此处已经可以调用IFileHandler.Process()了 } Console.ReadLine(); } } }
编译后,别忘了把Parts.dll拷贝到主程序的bin\\debug下。
运行:
我们已经把所有IHandler类型的实例创建出来了,并且运行了其中的成员函数。
以上是关于MEF入门之不求甚解,但力求简单能讲明白的主要内容,如果未能解决你的问题,请参考以下文章
C#可扩展编程之MEF学习笔记:MEF的导出(Export)和导入(Import)