標籤:
本文主要講的是通過反射動態擷取外掛程式。
首先所有的外掛程式必須遵守規範,這個規範是一個介面,定義如下:
1 public interface IEditPlus//interface一定要加public,否則外部無法引用2 {3 string Name { get; }//外掛程式的名字4 void ChangeString(TextBox tb);//改變字串的方法5 }
主視窗的介面
主要的思路是尋找/debug/lib檔案夾下的所有的.dll檔案,通過反射的方法對其進行操作。(在菜單編輯下添加子功能表)
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 //搜尋/bin/*.dll 4 //擷取當前程式集 5 Assembly ass = Assembly.GetExecutingAssembly(); 6 string dirPath = Path.Combine(Path.GetDirectoryName(ass.Location), "lib"); 7 string[] filePaths = Directory.GetFiles(dirPath, "*.dll");//在當前程式集的檔案夾中搜尋所有的dll檔案 8 foreach (var filePath in filePaths) 9 {10 Assembly assdll = Assembly.LoadFile(filePath);11 Type[] tps = assdll.GetTypes();12 foreach (Type tp in tps)13 {14 if (typeof(IEditPlus).IsAssignableFrom(tp) && !tp.IsAbstract)15 {16 IEditPlus ep = (IEditPlus)Activator.CreateInstance(tp);//擷取對象轉換為介面對象17 ToolStripItem tsi = tms.DropDownItems.Add(ep.Name);//為編輯菜單載入子功能表18 tsi.Tag = ep;//將這個對象作為tsi的Tag儲存19 tsi.Click += tsi_Click;//為這個子列表添加單擊事件20 }21 }22 }23 }24 void tsi_Click(object sender, EventArgs e)25 {26 ToolStripItem tsi = sender as ToolStripItem;//將sender顯示轉換為toolstripitem27 if (tsi!=null)//要判斷下tsi不為null,因為sender是一個接受的對象28 {29 //在事件中要操作IEditPlus的ChangeString方法,所以要從tag中取出30 IEditPlus ep = tsi.Tag as IEditPlus;31 ep.ChangeString(textBox1);32 }33 34 }
小寫轉大寫的dll檔案代碼---將產生的dll代碼放在主程式的/debug/lib檔案下
1 public class 小寫轉大寫:IEditPlus 2 { 3 public void ChangeString(System.Windows.Forms.TextBox tb) 4 { 5 tb.Text = tb.Text.ToUpper(); 6 } 7 public string Name 8 { 9 get { return "小寫轉大寫"; }10 }11 }
改變字型的dll代碼---將產生的dll代碼放在主程式的/debug/lib檔案下
先添加一個表單,介面
添加類的代碼:
1 public void ChangeString(System.Windows.Forms.TextBox tb)2 {3 FontFm ff = new FontFm(tb);4 ff.ShowDialog();5 }6 public string Name7 {8 get { return "字型"; }9 }
表單的代碼:
1 public FontFm() 2 { 3 InitializeComponent(); 4 } 5 public FontFm(TextBox tb):this() 6 { 7 this._tb = tb; 8 } 9 private TextBox _tb;//要操作TextBox tb添加欄位和建構函式10 private void button1_Click(object sender, EventArgs e)11 {12 _tb.Font = new Font(cbmFont.Text, float.Parse(cbmSize.Text));//改變字型13 this.Close();//關閉表單14 }
我自己覺得,反射和介面一起用,棒棒噠!!!
反射的方法操作記事本添加外掛程式