標籤:
1、介面
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PlugDemo{ public interface IPlugToText { string ProccessText(string text); }}
2、菜單屬性Class
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PlugDemo{ public class MenuNameAttribute:Attribute { private string _name; public string Name { get { return _name; } set { _name = value; } } public MenuNameAttribute(string name) { this._name = name; } }}
3、實現介面的實作類別
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ComPlugDemo{ [PlugDemo.MenuName("轉小寫")] public class PlugToLower : PlugDemo.IPlugToText { #region IPlugToText 成員 public string ProccessText(string text) { return text.ToLower(); } #endregion }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ComPlugDemo{ [PlugDemo.MenuName("轉大寫")] public class PlugToUpper:PlugDemo.IPlugToText { #region IPlugToText 成員 public string ProccessText(string text) { return text.ToUpper(); } #endregion }}
4、反射機制:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Reflection;using System.IO;using PlugDemo;namespace 外掛程式Demo{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { AddPlugMenu(); } void AddPlugMenu() { //1、載入正在啟動並執行程式集的實體路徑 Assembly ass = this.GetType().Assembly; string location = ass.Location; //2、擷取 程式集所在檔案夾,並轉成 外掛程式組件檔夾的路徑 string assDir = Path.GetDirectoryName(location); string plugDir = assDir + "\\plugs"; //3、掃描 產檢檔案夾裡的 所有組件檔 string [] dllPaths = Directory.GetFiles(plugDir,"*.dll"); //重點: 擷取外掛程式介面 類型對象 //4、遍曆組件檔路徑,並載入程式家到記憶體中 Type iplugType = typeof(IPlugToText); foreach (string dllPath in dllPaths) { //4.1 、根據路徑 載入組件檔 到記憶體中 Assembly amy = Assembly.LoadFrom(dllPath); //4.2 、判斷程式集中是否有外掛程式類 //4.2.1、擷取外掛程式程式集裡公有的類 Type[] types = amy.GetExportedTypes(); //4.2.2 迴圈遍曆 外掛程式程式集裡的類型 ,判斷是否實現記事本外掛程式介面 foreach (Type t in types) { //判斷 t 是否 實現了介面 IPlugToUpper if (iplugType.IsAssignableFrom(t)) { //重要,擷取的MenuNameAttribute 特性對象,或將 內部的Name現在到菜單中 object[] atts = t.GetCustomAttributes(typeof(MenuNameAttribute),false); MenuNameAttribute menuName = atts[0] as MenuNameAttribute; //重要:根據外掛程式類型,建立 外掛程式類 對象 IPlugToText iplug = Activator.CreateInstance(t) as IPlugToText; ToolStripMenuItem item = new ToolStripMenuItem(menuName.Name); plugMenu.DropDownItems.Add(item); item.Click += new EventHandler(item_Click); item.Tag = iplug; } } } } void item_Click(object sender, EventArgs e) { ToolStripMenuItem item = sender as ToolStripMenuItem; IPlugToText iplug = item.Tag as IPlugToText; textBox1.Text = iplug.ProccessText(textBox1.Text); } }}
C# 反射執行個體