C# MEF 通用插件框架

1 篇文章 0 订阅

废话少说,这个类我封装好了。

首先看下约定:

namespace PluginContract
{
    public interface IPlugin
    {
        string Name { get; set; }
        void SayHello();
    }
    public interface IPluginMark
    {
        string Mark { get; }
    }
}
//IPluginMark用来标识MetaData属性

自动加载插件类:
    public class PlugerBase<T>
    {
        public T GetClass(string className)
        {
            if (Names.Contains(className))
            {
                var plug = DoPluginList.Where(i => i.Metadata.Mark == className).Select(p => p.Value).FirstOrDefault();
                return (T)plug;
            }
            else
            {
                return default(T);
            }
        }
        public string[] Names
        {
            get
            {
                List<string> name = new List<string>();
                foreach (var item in DoPluginList)
                {
                    name.Add(item.Metadata.Mark);
                }
                return name.ToArray();
            }
        }
        /// <summary>
        /// 插件列表
        /// </summary>
        [ImportMany]
        private List<Lazy<T, IPluginMark>> DoPluginList = new List<Lazy<T, IPluginMark>>();
        public PlugerBase(string subFolderName="Plug")
        {
            Directory.CreateDirectory(Environment.CurrentDirectory + "\\"+ subFolderName);
            var catelog = new AggregateCatalog();
            AssemblyCatalog assemblyCataLog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
            catelog.Catalogs.Add(new DirectoryCatalog(subFolderName));
            var container = new CompositionContainer(catelog);
            container.ComposeParts(this);
        }
    }
插件端:
第一个:
namespace MEF_Demo//第一个插件实现的插件需要被调用应用的命名空间一致,切记
{
    [ExportMetadata("Mark", "2")]//Mark需要和接口名称同步IPluginMark.后面的2便是GetClass(string className)的className
    [Export(typeof(IPlugin))]
    public class PluginFirst : IPlugin
    {
        public string Name { get; set; } = "张三";

        public void SayHello()
        {
            MessageBox.Show($"你好啊{Name}");
        }
    }
}
第二个:
namespace MEF_Demo
{
    [ExportMetadata("Mark","1")]
    [Export(typeof(IPlugin))]
    public class PluginSecod : IPlugin
    {
        public string Name { get; set; } = "李四";
        public void SayHello()
        {
            MessageBox.Show($"你好啊{Name}");
        }
    }
}


最后调用时非常简单:
 public MainWindow()
 {
    InitializeComponent();
    PlugerBase<IPlugin> plug = new PlugerBase<IPlugin>();//编译好的插件需要放置在Plug文件夹内
    var d= plug.GetClass("1");//通过名称直接反射出对应的类
    d.SayHello();
 }  


### 回答1: 对于“c”的问题,需要进一步明确问题的具体内容。在数学中,“c”可能代表一些常数或系数,例如在一元一次方程中,c通常代表常数项;在求导中,c则代表常数函数的导数为零;在复数中,c则常用于表示实部。 在计算机领域中,C语言是一种广泛使用的编程语言,它具有高效、可移植、简洁等特点,成为了操作系统、网络、嵌入式系统等方面的主流开发语言。同时,“c”也是C语言代码中的一个标记符号,通常用于表示变量或函数名。 除此之外,在其他领域中,“c”也可能有不同的含义和用法。例如在物理学中,c代表光速常数;在化学中,c可能代表一种化合物的命名方式等。 综上所述,对于“c”的问题需要明确具体的语境和意义,才能准确回答。 ### 回答2: C是计算机科学中的一种编程语言,也是一种很常见的编程语言。它由美国贝尔实验室的丹尼斯·里奇在20世纪70年代初开发而成。 C语言具有简洁、高效的特点,被广泛应用于系统软件和应用软件开发中。C语言通过控制硬件资源和底层操作系统功能,提供了对计算机底层的直接访问能力,因此在开发操作系统、嵌入式系统和驱动程序等方面有着广泛的应用。 C语言的语法简洁明了,易于学习和理解。它具有结构化的特点,支持模块化的程序设计,程序可以分成多个独立的、可复用的模块,方便代码的维护和扩展。C语言还提供了丰富的库函数,开发者可以利用这些库函数快速实现各种功能。 C语言是编写高效代码的重要工具。由于C语言的语法和特性与机器语言非常接近,因此编写的程序在执行效率上非常高。C语言还可以直接调用汇编语言,利用汇编语言进行优化,进一步提高了程序的性能。 总之,C语言是一种重要的编程语言,广泛应用于计算机科学领域。其简洁、高效、灵活的特点使得它成为开发各种软件和系统的首选语言之一。对于想要从事编程领域的人来说,掌握C语言是一个重要的基础,可以帮助他们理解底层原理,提高程序的执行效率,实现各种功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值