[MEF插件式開發] 一個簡單的例子

来源:http://www.cnblogs.com/shensigzs/archive/2016/05/27/5534548.html
-Advertisement-
Play Games

偶然在博客園中瞭解到這種技術,順便學習了幾天。 以下是搜索到一些比較好的博文供參考: MEF核心筆記 《MEF程式設計指南》博文彙總 先上效果圖 一、新建解決方案 開始新建一個解決方案Mef,再添加一個winform項目為:MefDemo 如圖: 打開Form1視窗,拉入MenuStrip菜單控制項, ...


偶然在博客園中瞭解到這種技術,順便學習了幾天。

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

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下載

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 索引的基本概念: (1).要理解索引,可以把書作為一個模型類比。一本書里的內容,相當於一張大表存儲的數據,而書前面的目錄就相當於這個表的索引; (2).索引可以擁有獨立的存儲磁碟空間; (3).索引占用的磁碟空間要比表小的多,其主要作用是為了加快對數據的搜索速度; (4).同時可以保證數據的唯一性。 ...
  • 今天在幫客戶做語句優化的時候,突然遇到這樣一個語句,類似下麵的例子(原語句是個update) 例子中使用AdventureWorks數據中的兩個表。 productID 是[Production].[Product] 表的主鍵,在[Purchasing].[PurchaseOrderDetail] ...
  • [epeter@ localhost ~]$ 其中:epeter 是用戶名;localhost 是當前主機名; ~ 破浪號代表當前是用戶目錄( 如果是 / 斜線代表當前是根目錄);$ 代表當前以普通用戶登錄(如果是 # 代表當前以根用戶登錄(root用戶或者具有管理員許可權))。 命令由三個部分組成: ...
  • 註意首先要安裝url重定向模塊 https://www.microsoft.com/zh-CN/download/details.aspx?id=7435 然後在web.config末尾添加如下代碼 <system.webServer> <rewrite> <rules> <rule name="H ...
  • 本程式為自己所寫,參考素材包括微軟官方例子和外文資料,自己做了部分的優化。解釋的如果有問題,懇請大家指正. 後臺代碼: XAML界面代碼: ...
  • 1、先解釋一下,什麼叫做動態數據,動態數據指的是,一條數據的格式固定,但數據的條數不固定。 2、應用環境,在一個表格當中如果,現在表格有三行n列,如果你需要在表格第一行後添加同等規格的一行或n行,應該怎麼去做? 3、根據上面的應用環境,不難發現,要完成這項工作的5個過程,1、找到位置。2、獲取模板行 ...
  • 導出時:引用 using Excel = Microsoft.Office.Interop.Excel; #region 讀取excel //打開方法 public DataTable ExceltoDataSet(string path) { string strConn = "Provider= ...
  • 1、 前言 最近剛換了一家公司,由於之前的公司代碼並沒有用到項目框架,需要我整理下NHibernate與Entity Framework之間的區別及適用性。並寫出相關的示例代碼 面試的時候吹的牛,得把他填上啊。 剛剛整完相應的EF code first的示例代碼,需要連接oracle,那個資料庫遷移 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...