MEF插件式开发

article/2025/9/15 1:44:22

一、MEF 简介

1、 Managed Extensibility Framework简称MEF,是WPF中的一种插件式开发的框架。其开发程序的主要优点如下:

  • 易于将复杂程序进行拆分成不同的功能模块,然后进行多团队的协作。将各个功能编译成dll的形式提供给主程序,由主程序进行统一加载。
  • 便于程序的后期扩展,在后期需要添加新功能时,只需要提供对应的dll即可,主程序无需进行大的改动。
  • 不同模块间的功能相对独立,降低程序的耦合性,使程序易于维护。

2、MEF 的使用需要引用System.ComponentModel.Composition,该dll提供了MEF开发的核心功能。

3、MEF程序的组成部分:

  • 主程序:一般为一个WPF可执行应用程序,用来提供整个程序的框架,并加载各个功能模块所编译生成的dll程序集。
  • 接口程序:一般为类库项目(即Class Library),编译生成dll文件。主要用来定义主程序与各个Plugin插件程序之间的接口,只有定义好这些接口才能保证主程序正确加载各个Plugin
  • 插件程序:一般为WPF User Control Library,即各个独立的功能模块,编译生成dll文件,被主程序加载使用。

二、MEF程序创建流程

所有项目均位于解决方案MEF_Project

1、创建WPF应用主程序

1.1 主程序为WPF Application
在这里插入图片描述
1.2 后续接口项目和各个Plugin项目编译完成后,需要再完善主程序以加载各个插件

2、创建接口项目MyInterface

在这里插入图片描述
2.1 接口项目中,接口类型的关键字为interface,在接口中只能声明而不能有具体的实现,具体的实现需要在其派生类中来进行。

2.2 该项目中定义如下接口:

namespace MyInterface
{/// <summary>/// 定义接口类型/// </summary>public interface IMyInterface{string GetPluginName();int GetPluginId();}
}

2.3 因为后续的Plugin项目需要引用该接口生成的dll文件,所以需要先对该接口项目进行编译,以生成对应的dll文件,在此编译生成 MyInterface.dll 文件。

3、创建插件项目PluginA

该项目为UserControl类型,如下图所示
在这里插入图片描述
3.1XAML文件进行设计,如下所示:

<UserControl x:Class="PluginA.UserControl1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:PluginA"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><StackPanel><Label x:Name="labelA" Content="Pugin A Page" FontSize="40" HorizontalAlignment="Center"/></StackPanel>
</UserControl>

3.2 .cs文件中,添加两个对应的dllReferences,并引用到命名空间中
(1)、在References中添加MEF对应dllSystem.ComponentModel.Composition;,并引用到命名空间中,如下图:
在这里插入图片描述
(2)、在References中添加接口项目编译生成的dllMyInterface.dll,并引用到命名空间中,如下图:
在这里插入图片描述
3.3 导入并实现该接口,代码如下:

using System.Windows.Controls;
using System.ComponentModel.Composition;
using MyInterface;namespace PluginA
{/// <summary>/// Interaction logic for UserControl1.xaml/// </summary>// 导入该接口[Export(typeof(IMyInterface))]public partial class UserControl1 : UserControl, IMyInterface{public UserControl1(){InitializeComponent();}//对接口IMyInterface的实现public int GetPluginId(){return 0;}public string GetPluginName(){return "This is Plugin A";}}
}

3.3 编译生成对应的PluginA.dll文件

【以同样的方式创建PluginB


4、完善主程序MainProgram,加载上面编译生成的各个Plugin插件

4.1 设计主程序的UI,对应的MainWindow.xaml文件如下:

<Window x:Class="MainProgram.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:MainProgram"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="100"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><!--左侧为ListView栏--><ListView x:Name="ItemsList" Grid.Column="0" Background="Bisque"/><!--中间为分割条--><GridSplitter Grid.Column="1" Width="6" VerticalAlignment="Stretch" HorizontalAlignment="Center" ShowsPreview="False"/><!--右侧显示加载的各个Plugin的内容--><Frame x:Name="frameContent" Grid.Column="2"/></Grid>
</Window>

在这里插入图片描述

4.2MainWindow.xaml.cs中添加对应的dll文件
(1)、在References中添加MEF对应dllSystem.ComponentModel.Composition;,并引用到命名空间中。
(2)、在References中添加接口项目编译生成的dllMyInterface.dll,并引用到命名空间中。

4.3 在主程序中解析、加载对应Plugin程序集,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using MyInterface;namespace MainProgram
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{private IEnumerable<IMyInterface> myPlugins;public MainWindow(){InitializeComponent();//new DirectoryCatalog 的默认加载目录为:该程序的exe文件目录下,为Debug目录或Release目录var catalog = new DirectoryCatalog("../../MyPlugins");var container = new CompositionContainer(catalog);myPlugins = container.GetExportedValues<IMyInterface>();foreach (var plg in myPlugins){/*该方式只是简单的加载显示,但没有任何事件,点击也无效* string name = plg.GetPluginName();this.ItemsList.Items.Add(new TabItem() { Header = name, Content = plg });*/Button btn = new Button();btn.FontSize = 20;btn.FontFamily = new FontFamily("Times New Roman");btn.HorizontalAlignment = HorizontalAlignment.Center;btn.Content = plg.GetPluginName();btn.Tag = plg.GetPluginId();btn.Click += Btn_Clicked;ItemsList.Items.Add(btn);}}private void Btn_Clicked(object sender, RoutedEventArgs e){Button btn = sender as Button;int id = Convert.ToInt32(btn.Tag); //Tag为object类型,需要显示的转换成int类型frameContent.Content = myPlugins.ElementAt(id);}}
}

4.4 在主程序目录下创建文件夹,存放各个Plugin编译生成的dll文件,以被主程序加载,整体的文件结构如下所示:

  • MainProgram:为主程序项目目录
  • MyInterface:为接口程序项目目录
  • PluginA:为插件A项目目录
  • PluginB:为插件B项目目录
    在这里插入图片描述
    在这里插入图片描述

4.5 运行结果如下:
在这里插入图片描述


参考资料:
[1] Managed Extensibility Framework
[2] System.ComponentModel.Composition Namespace


http://chatgpt.dhexx.cn/article/hAEBNPFC.shtml

相关文章

C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

在文章开始之前&#xff0c;首先简单介绍一下什么是MEF&#xff0c;MEF,全称Managed Extensibility Framework&#xff08;托管可扩展框架&#xff09;。单从名字我们不难发现&#xff1a;MEF是专门致力于解决扩展性问题的框架&#xff0c;MSDN中对MEF有这样一段说明&#xff1…

【C#进阶系列】【MEF框架(一)】

C#进阶系列 第一章 【C#进阶系列】【MEF框架&#xff08;一&#xff09;】 文章目录 C#进阶系列前言一、MEF介绍二、为什么要用MEF三、MEF的概念四、使用示例五、MEF框架的好处六、源码链接总结 前言 这里对MEF作了基本的介绍&#xff0c;包括使用了一个特定场景&#xff08;…

【虚拟化生态平台】平台架构图思路和实现细节

设计思路 我需要一个内网生态&#xff0c;通过一个nginx访问到我所有的资源&#xff0c;内部实现细节我不关心&#xff0c;那么就需要一个nginx服务器来负载所有的服务服务器太多了&#xff0c;我不想一个个的记录ip去登录&#xff0c;那我就需要一个跳板机来记录我的服务器&a…

ARM平台的虚拟化介绍

本篇博文主要介绍虚拟化的基本思想以及在arm平台如何做虚拟化&#xff0c;arm提供的硬件feature等等。 虚拟化技术简介 虚拟化技术 虚拟化是一个概念&#xff0c;单从这个概念的角度来看&#xff0c;只要是用某一种物品去模拟另一种物品都可以称为虚拟化&#xff0c;甚至于有…

ARMv8虚拟化

1 概述 2 虚拟化简介 3 AArch64虚拟化 4 Stage-2地址转换 5 指令的陷入和模拟 6 虚拟化异常 7 虚拟化通用定时器 8 虚拟化主机扩展 9 嵌套虚拟化 10 安全空间的虚拟化 11 虚拟化的成本 12 小测验 13 其它参考文章 14 接下来的计划 1 概述 本文描述了ARMv8-64的虚…

虚拟化服务器环境搭建方案,虚拟化环境建设方案

虚拟化环境建设方案 市场背景: 随着IT技术的飞速发展,基础传统IT架构模式下的应用规模扩大,需要更多的服务器来支持业务的发展,同时出现了如下几个问题: 1.资源利用率低、闲置率高,运行效率低 2.应急处理响应时间慢、服务保障差 3.运行维护成本高 虚拟化的出现很好的解决…

搭建vmware虚拟化平台的基础配置,以及Hadoop平台的搭建

需要准备的东西&#xff1a; vmware workstations centos.iso hadoop3.3.0 mobaxterm/xshell/pietty/winscp jdk的tar包 第一步 &#xff1a; 安装centos操作系统 第二步 &#xff1a; 克隆虚拟机&#xff08;也可以在hadoop安装后再克隆&#xff09; 我们这里需要选择完整克隆…

WSL2 请启用虚拟机平台 Windows 功能并确保在 BIOS 中启用虚拟化

bcdedit /set hypervisorlaunchtype autoC:\WINDOWS\system32>bcdedit /set hypervisorlaunchtype auto 操作成功完成。

嵌入式虚拟化平台jailhouse踩坑笔记

目录 简介 相关论文 架构 jailhouse的应用示例 jailhouse 官方demo jailhouse的运行 jailhouse none-root cell中挂载nfs作为根目录启动linux 注意事项 jailhouse的配置 1.cell配置文件简介 2. cell文件的生成过程 2. .c配置文件内容解析 QEMU中实现jailhouse的…

搭建华为FusionCompute虚拟化平台

最小实验要求&#xff1a;两台服务器 1、通过BMC口安装CNA操作系统 远程光驱安装CNA&#xff0c;需要设置服务器从远程光驱启动&#xff0c;然后进入BIOS可以查看BMC控制台的用户名和密码&#xff0c;以及IP&#xff0c;一般服务器都默认有。然后登陆BMC的控制台&#xff0c;进…

服务器虚拟化 涉密,面向高安全服务器虚拟化领域应用研制的安全保密虚拟化平台...

中标麒麟服务器虚拟化系统是基于中标麒麟虚拟化平台软件V7&#xff0c;面向高安全服务器虚拟化领域应用研制的安全保密虚拟化平台&#xff1b;产品通过国家保密科技测评中心基于《涉密信息系统服务器虚拟化和桌面虚拟化产品安全保密技术要求》(BMB30-2017)的安全性检测。支持海…

VA虚拟平台十大亮点

VA虚拟平台十大亮点 一、自适应多种安装环境、并可以手动调整二、兼容互联网上主流动态域名自动连接&#xff0c;并有自主的动态域名解析。三、系统稳定性有效保障和看门狗机制四、高级参数最大限度保障程序兼容性五、智能打印-动态调整、实时预览、多页排版、自动打印六、向下…

Linux虚拟化平台检测

如果要找出 Linux 系统运行在虚拟化平台中还是硬件服务器上&#xff0c;有多种方式可供大家选择&#xff0c;这主要取决于你的 hypervisor 或 container 环境。不同的虚拟化或容器技术会在其实例中引入不同的识别指纹&#xff0c;如&#xff1a;处理器厂商、特殊的 /proc 文件或…

虚拟化平台PVE(ProxmoxVirtual Environment)安装部署

PVE是一个完整的企业虚拟化开源平台。通过内置的web界面&#xff0c;可以轻松地管理虚拟机和容器、软件定义的存储和网络、高可用性集群和多个开箱即用的工具。 官方&#xff1a;Proxmox - Powerful open-source server solutions 部署前准备 1.下载镜像&#xff0c;并刻录到U…

云平台管理与部署---虚拟化平台-----KVM

第一&#xff0c;搭建KVM服务器 1&#xff0c;虚拟化平台的安装 # yum -y install qemu-kvm libvirt-daemon libvirt-client libvirt-daemon-driver-qemu # systemctl start libvirtd # ls /etc/libvirt/qemu # ls /var/lib/libvirt/images/ 第二&#xff0c;管理KVM平台 1…

云计算-华为虚拟化平台FusionCompute

目录 FusionCompute产品介绍 FusionCompute虚拟化套件 FusionCompute产品定位 FusionCompute在虚拟化套件中位置 FusionCompute产品架构 FusionCompute模块功能模块 ​编辑FusionCompute产品功能 - 虚拟化计算 FusionCompute产品功能 - 虚拟化存储 FusionCompute产品功…

服务器虚拟化如何分配内存,VMware虚拟化平台内存如何管理?

当运行一个虚拟机时,vSphere的VMKernel为虚拟机生成一段可编址的连续内存,与普通操作系统提供给上层应用使用的内存具有相同的属性特征。引入内存虚拟化之后,同样的内存地址空间,允许VMkernel同时运行多个虚拟机并保证它们之间使用内存的独立性。 虚拟化平台三种内存模式 主…

Linux部署KVM虚拟化平台

了解KVM&#xff1a; Kernel-based Virtual Machine的简称&#xff0c;是一个开源的系统虚拟化模块&#xff0c;自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理&#xff0c;所以相对于Xen&#xff0c;其核心源码很少。KVM已成为…

综合虚拟试衣平台

【摘要】 综合虚拟试衣平台是一个完整的虚拟试衣体验系统&#xff0c;拥有电子商城、线下虚拟试衣设备、核心SAAS平台三个模块。人们可以在线上线下&#xff0c;通过鼠标选择场景、人物、衣物自动生成试衣动画&#xff0c;或是通过摄像头摆拍实时获取。用户可通过此平台体验从…

VMware ESXi-虚拟化平台的搭建

前言&#xff1a;vSphere 是VMware公司推出一套服务器虚拟化解决方案&#xff0c;其核心组件为 VMware ESXi 和VMware vCenter&#xff0c;本文简单介绍VMware ESXi 的安装使用。 它与我们常用的虚拟机不同的是&#xff0c;日常使用的虚拟机是需要依赖于一个操作系统的&#xf…