只使用.NET中的MEF获取必要的插件我有IMessageSender接口。使用System.ComponentModel.Composition;公共接口IMessageSender{voidSend(字符串消息);我有两个实现这个接口的插件。这是plugin.cs。使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;[Export(typeof(IMessageSender))]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message);}}这是plugin2.cs[Export(typeof(IMessageSender))]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message+"!!!!");我有这段代码可以使用MEF运行这些插件。使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用System.Collections.Generic;使用系统;publicclassProgram{[ImportMany]publicIEnumerableMessageSender{get;Main(string[]args){Programp=newProgram();p.Run();foreach(p.MessageSender中的var消息){message.Send("hello,world");}}publicvoidRun(){Compose();}privatevoidCompose(){varcatalog=newAggregateCatalog();catalog.Catalogs.Add(新目录目录(@"./"));varcontainer=newCompositionContainer(catalog);container.ComposeParts(这个);}}编译后,我得到了我想要的。>monoprogram.exe你好,世界你好,世界!!!!我的问题是如何有选择地耗尽许多插件。这个例子只是获取所有可用的插件来运行它们,但是当我只想运行第一个或第二个插件时我该怎么办?例如,我可以按如下方式运行plugin2.dll吗?publicstaticvoidMain(string[]args){Programp=newProgram();p.Run();varmessage=messageSender.GetPlugin("插件");//???message.Send("你好,世界");解决基于这个网站,以及MatthewAbbott的回答。我可以想出这个工作代码。接口代码(interface.cs)usingSystem.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;公共接口IMessageSender{voidSend(字符串消息);}publicinterfaceIMessageSenderMetadata{字符串名称{get;}字符串版本{get;}}[MetadataAttribute][AttributeUsage(AttributeTargets.Class,AllowMultiple=false)]publicclassMessageMetadataAttribute:ExportAttribute,IMessageSenderMetadata{publicMessageMetadataAttribute(字符串名称,字符串版本):base(typeof(IMessageSender)){Name=name;版本=版本;}公共字符串名称{得到;放;}公共字符串版本{得到;放;}}插件代码(Plugin.cs…)usingSystem.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用系统;[MessageMetadataAttribute("EmailSender1","1.0.0.0")]publicclassEmailSender:IMessageSender{publicvoidSend(stringmessage){Console.WriteLine(message+"????");}}Program.cs中使用System.ComponentModel.Composition;使用System.ComponentModel.Composition.Hosting;使用System.Reflection;使用System.Collections.Generic;使用系统;使用System.Linq;公共类程序{[ImportMany(typeof(IMessageSender),AllowRecomposition=true)]publicIEnumerable
