using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
//以下三个命名空间必须
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
namespace ConsoleApplication1
{
class Program
{
//主程序
static void Main(string[] args)
{
Program p = new Program();
p.Run();
}
public void Run()
{
Compend c = new Compend();
foreach (var item in c.iPersons)
{
item.Write();
}
Console.ReadKey();
}
}
//申明导入
public class Compend
{
[ImportMany]//标识为导入,当要导入多个时用ImportMany,一个是为Import
public IEnumerable<IPerson> iPersons { get; set; }//还可为 IPerson[]
public Compend()
{
//把从指定path发现的部件添加到目录中。此处表示就在当前程序中
AssemblyCatalog catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//AggregateCatalog aggregate = new AggregateCatalog();
//aggregate.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
//aggregate.Catalogs.Add(new DirectoryCatalog(Directory.GetCurrentDirectory()));
//AssemblyCatalog catalog = new AssemblyCatalog(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath);
//定义组合容器
CompositionContainer container = new CompositionContainer(aggregate);
//通过调用容器的ComposeParts()方法可以把容器中的部件组合到一起
container.ComposeParts(this);//this
}
}
[Export]//声明导出
public class PersonE:IPerson
{
public void Write()
{
Console.WriteLine("EEEEEEE");
}
}
//声明为导出,并指定导入类型为IPerson,这样,方便导入类型标识为IPerson的导入部件的发现,就可以从此处导入
[Export(typeof(IPerson))]
public class PersonC : IPerson
{
public void Write()
{
Console.WriteLine("CCCCCCCCCCCC");
}
}
public interface IPerson//接口
{
void Write();
}
}
MEF初步
最新推荐文章于 2018-07-19 20:38:05 发布