MEF 在 WPF 中的簡單應用

MEF核心筆記MEF 的開發模式主要適用于插件化的業務場景中,C/S 和 B/S 中都有相應的使用場景,其中包括但不限于?ASP.NET MVC?、ASP WebFormsWPFUWP?等開發框架。當然,DotNet Core?也是支持的。

以下是搜索到一些比較好的博文供參考:

MEF核心筆記

《MEF程序設計指南》博文匯總

先上效果圖

一、新建解決方案

開始新建一個解決方案Mef,再添加一個winform項目為:MefDemo

如圖:

打開Form1窗口,拉入MenuStrip菜單控件,把name改名為"ms",菜單控件什么菜單都不加,如下圖:

接著雙擊窗口寫如下代碼:

private void Form1_Load(object sender, EventArgs e){ToolStripMenuItem item = new ToolStripMenuItem("插件");ms.Items.Add(item);foreach (IPlugin plugin in plugins){ToolStripMenuItem subItem = new ToolStripMenuItem(plugin.Text);subItem.Click += (s, arg) => { plugin.Do(); };item.DropDownItems.Add(subItem);}}

在繼續寫一個初始化插件代碼:

private CompositionContainer _container;private void Init(){//設置目錄,讓引擎能自動去發現新的擴展var catalog = new AggregateCatalog();catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory+"plugin\\"));//創建一個容器,相當于是生產車間_container = new CompositionContainer(catalog);//調用車間的ComposeParts把各個部件組合到一起try{this._container.ComposeParts(this);//這里只需要傳入當前應用程序實例就可以了,其它部分會自動發現并組裝}catch (CompositionException compositionException){Console.WriteLine(compositionException.ToString());}}

Form1構造函數加入Init方法,程序剛啟動時會從運行目錄下plugin目錄搜索所有dll文件并加載,plugin就是插件目錄,所有插件都放到這個目錄下

public Form1(){InitializeComponent();Init();}

二、新建接口類庫PluginInterface

現在來創建一個接口項目(PluginInterface),它就像數據線或電源線一樣,一端連接終端(手機、電腦),一端插到插座(電腦USB接口、插排),完全可以相像一下,手機在電腦充電的情形(它就需要一條數據線,一端連手機,一端連電腦)。

再新建一個接口IPlugin

public interface IPlugin{string Text { get; } //插件名稱void Do(); //動作}

現在回到主程序,打開Form1窗口,寫上如下代碼:

需要引用System.ComponentModel.Composition

[ImportMany]public IEnumerable<IPlugin> plugins;

三、新建插件類庫

現在可以來開發一個插件,為了方便,我在同一解決方案下創建,創建了一個Plugin1類庫

再類庫下新建一個類MyPlugin并實現IPlugin,有一點要注意,需要把MyPlugin命名空間改成和主程序一樣

namespace MefDemo
{[Export(typeof(IPlugin))]public class MyPlugin:IPlugin{public string Text{get { return "插件1"; }}public void Do(){MessageBox.Show(Text);}}
}

同樣的方法再創建2個插件類庫,分別是Plugin2、Plugin3(winform)

插件類庫編譯后,復制dll到主程序plugin目錄下

Demo下載

參考文章:[MEF插件式開發] 一個簡單的例子 - 李子深 - 博客園

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914700.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gitlab跑CICD的時候,maven鏡像和pom.xml使用的maven版本沖突導致沒辦法build成功的解決方法

是這樣的&#xff01;最近遇到一個非常棘手的難題&#xff0c;我搞了大概2周時間才把他弄出來&#xff0c;因為自己搭了個私服的maven倉庫&#xff0c;他不像maven官方倉庫一樣&#xff0c;可以跟nginx一樣轉的&#xff0c;所以遇到好幾個難點&#xff01;第一點&#xff1a;就…

Linux內核IPv4路由查找:LPC-Trie算法的深度實踐

在互聯網基礎設施的核心領域,路由查找性能直接決定了網絡轉發效率。Linux內核作為現代網絡系統的基石,其IPv4路由子系統采用了一種名為LPC-Trie(Level-Compressed Trie) 的創新數據結構,在net/ipv4/fib_trie.c文件中實現了高效的路由管理方案。本文將深入剖析這一機制的設…

【設計模式】裝飾(器)模式 透明裝飾模式與半透明裝飾模式

裝飾模式&#xff08;Decorator Pattern&#xff09;詳解一、裝飾模式簡介 裝飾模式&#xff08;Decorator Pattern&#xff09; 是一種 結構型設計模式&#xff0c;它允許你動態地給對象添加行為或職責&#xff0c;而無需修改其源代碼&#xff0c;也不需要使用繼承來擴展功能。…

NAT原理與實驗指南:網絡地址轉換技術解析與實踐

NAT實驗 NAT&#xff08;Network Address Translation&#xff0c;網絡地址轉換&#xff09;&#xff1a; NAT技術的介紹&#xff1a; 隨著Internet用戶的快速增長&#xff0c;以及地址分配不均等因素&#xff0c;IPv4地址&#xff08;約40億的空間地址&#xff09;已經陷入不…

設計模式之【觀察者模式】

目錄 觀察者模式中的角色 通過一個簡單案例來演示觀察者模式 被觀察者接口 事件類型 up主類作為被觀察者 觀察者接口 粉絲類作為觀察者 測試 測試結果 觀察者模式中的角色 被觀察者(observable)觀察者(observer) 通過一個簡單案例來演示觀察者模式 被觀察者接口 /*…

Linux sudo host權限提升漏洞(CVE-2025-32462)復現與原理分析

免責聲明 本文所述漏洞復現方法僅供安全研究及授權測試使用&#xff1b; 任何個人/組織須在合法合規前提下實施&#xff0c;嚴禁用于非法目的&#xff1b; 作者不對任何濫用行為及后果負責&#xff0c;如發現新漏洞請及時聯系廠商并遵循漏洞披露規則。 漏洞簡述 Linux sudo是l…

【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出現刪除等功能

1.網址&#xff1a;https://ext.dcloud.net.cn/plugin?id181](https://ext.dcloud.net.cn/plugin?id181) 2.csdn講解&#xff1a;https://blog.csdn.net/qq_40323256/article/details/114337128 3.uni-ui git&#xff1a;https://github.com/dcloudio/uni-ui 4.官方網址文檔&…

記一次POST請求中URL中文參數亂碼問題的解決方案

POST請求中URL中文參數亂碼前言&#xff1a;一個常見的開發痛點一、問題現象與原因深度解析1. 典型問題場景2. 根本原因分析URL編碼規范問題&#xff1a;編碼解碼過程不一致&#xff1a;IE瀏覽器特殊行為&#xff1a;二、前端解決方案1. 手動編碼URL參數&#xff08;推薦&#…

從存儲熱遷移流程了解 QEMU block layer

文章目錄存儲熱遷移流程總體流程代碼路徑QEMU Block layer架構簡述Block Job結構體設計狀態轉換Mirror block job拓撲結構構建過程數據結構存儲熱遷移流程 總體流程 Libvirt migrate 命令提供 copy-storage-all 選項支持存儲熱遷移&#xff0c;相應地&#xff0c;Libvirt 熱遷…

【設計模式】命令模式 (動作(Action)模式或事務(Transaction)模式)宏命令

命令模式&#xff08;Command Pattern&#xff09;詳解一、命令模式簡介 命令模式&#xff08;Command Pattern&#xff09; 是一種 行為型設計模式&#xff08;對象行為型模式&#xff09;&#xff0c;它將一個請求封裝為一個對象&#xff0c;從而使你可以用不同的請求對客戶進…

HTML5智能排班日歷:動態排班一目了然

這個日歷將具備以下功能: 顯示一個標準的月度日歷視圖。可以自由切換上一個月和下一個月。在日歷的每一天自動顯示當天值班的人員。您可以很方便地在文件中修改值班人員列表和排班的起始日期。包括:動態生成日歷網格處理月份切換根據排班規則計算并顯示每天的值班人員<!DO…

深度剖析C++生態系統:一門老牌語言如何在開源浪潮中煥發新生?

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、前言&#xff1a;C的“長壽秘訣”是什么&#xff1f; C 誕生已超過 40 年。它經歷了桌面應用、互聯網爆發、移動時代&#xff0c;再…

60個功能OfficeBox 萬彩辦公大師:PDF 格式轉換 OCR識別免費無廣告

各位辦公小能手們&#xff01;今天給大家介紹個超厲害的免費辦公工具套裝——OfficeBox萬彩辦公大師&#xff0c;是廣州萬彩科技整出來的。軟件下載地址安裝包 它里面有60多個沒廣告的綠色組件&#xff0c;簡直像個百寶箱&#xff01;涵蓋了PDF處理、格式轉換、OCR識別、屏幕錄…

擁抱主權AI:OpenCSG驅動智能體運營,共筑新加坡智能高地

2025年7月11日&#xff0c;由Linux基金會AI & Data、TikTok及LF Edge聯合主辦的 【LF AI & Data Day Singapore 2025】 在新加坡TikTok總部盛大啟幕。本次大會以“Agent for SWE”為核心議題&#xff0c;匯聚全球頂尖AI開發者、企業領袖及開源社區先鋒。作為國家主權AI…

單片機學習筆記.根據芯片數據手冊寫驅動程序(這里使用的是普中開發版,以DS1302為例)

硬件原理圖部分&#xff1a; VCC2:是主電源 VCC1&#xff1a;是備用電源&#xff0c;此處沒有使用VCC1 查芯片數據手冊的網站&#xff1a; ALLDATASHEETCN.COM - 電子元件和半導體及其他半導體的數據表搜索網站。https://www.alldatasheetcn.com/ 1.由原理圖可知對應引腳&…

Capture One24下載與保姆級安裝教程!

軟件下載 軟件名稱&#xff1a;Capture One24 軟件語言&#xff1a;簡體中文 軟件大小&#xff1a;1.06G 系統要求&#xff1a;Windows7或更高&#xff0c;32/64位操作系統 硬件要求&#xff1a;CPU2.5GHz&#xff0c;RAM4G或更高 下載通道丨下載&#xff1a;https://too…

微信小程序(數據庫)

const dbwx.cloud.database()//連接數據庫db.collection("test").doc("b69f67c0626fac9000e123fc1ff07a42&#xff08;為要查詢數據的id&#xff09;").get({success:res>{console.log(res)}})或getData(){db.collection("test").doc("&…

Apache CXF 漏洞曝光:存在拒絕服務與數據泄露雙重風險

Apache軟件基金會近日披露了一個影響多個Apache CXF版本的安全漏洞&#xff08;CVE-2025-48795&#xff09;。Apache CXF是開發者廣泛使用的開源Web服務框架&#xff0c;用于構建基于SOAP和REST的應用程序。漏洞雙重威脅該漏洞具有雙重危害性&#xff1a;一方面可能通過內存耗盡…

Android 應用自動更新:從理論到實戰的硬核指南

目錄 1. 自動更新的核心邏輯:為什么它對用戶體驗至關重要? 自動更新的本質 為什么它如此重要? 2. 版本檢測:如何優雅地發現“新大陸”? 設計版本檢測的邏輯 實現版本檢測的 API 請求 用戶體驗優化 3. 下載新版本:穩妥地獲取安裝包 下載的兩種方式 注意事項 用戶…

每日面試題05:ArrayList和LinkedList的底層原理

ArrayList與LinkedList深度解析&#xff1a;從底層原理到實戰選擇在Java的List接口實現中&#xff0c;ArrayList和LinkedList是最常用的兩種選擇。面試中“它們的區別”幾乎是必問題&#xff0c;但僅僅停留在“數組vs鏈表”的層面顯然不夠。本文將從??底層數據結構、內存布局…