[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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...