=================插件實施與應用基本流程c#
1,開發此程序的人 提供接口(提供DLL)ide
2,第三方開發團隊(開發插件)嚴格按照接口,實現功能。並打包成DLLthis
3,使用者下載第三方開發團隊開發出來的插件,並把查詢複製到程序相應的文件夾裏spa
=================程序開發思想插件
1,在程序中建立一個類庫,在內庫中定義一個接口orm
2,第三方開發團隊拿到接口,並是實現其功能。打包成dll文件接口
3,copy第三方團隊開發的dll到程序指定的目錄開發
4,找到dll存放的路徑string
5,遍歷全部dll的路徑it
6,經過路徑加載程序集(插件)
7,加載程序集(插件)中全部的公共的類
8,加載接口類
9,遍歷插件的全部的公共類
10,判斷接口是否可以與插件裏的類對接
11,若是能,則反射
===================================================Form1主窗體
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Reflection; namespace MyReflect { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { LoadAssembly(); } private void LoadAssembly() { //獲取存放dll插件的文件路徑 string mypath = Directory.GetCurrentDirectory() + "\\MyDll"; string[] filepath = Directory.GetFiles(mypath, "*.dll"); //辦理路徑 foreach (string file in filepath) { //根據路徑加載文件下的程序集 Assembly ass = Assembly.LoadFrom(file); //獲取程序集中全部公有的類 Type[] tclass= ass.GetExportedTypes(); //獲取接口的類 Type tform= typeof(InterfaceForm.FormTitle); //------------------------------------------------ int i = 0; //------------------------------------------------ //遍歷插件的全部公共類 foreach (Type t in tclass) { //判斷接口是否能與插件的類對接 if (tform.IsAssignableFrom(t)) { //反射 InterfaceForm.FormTitle tf = Activator.CreateInstance(t) as InterfaceForm.FormTitle; Button b = new Button(); b.Text = t.Name; b.Location = new Point(0, i); b.Tag = tf; b.Click += b_Click; Controls.Add(b); } i += 50; } } } void b_Click(object sender, EventArgs e) { Button b= sender as Button; InterfaceForm.FormTitle tf= b.Tag as InterfaceForm.FormTitle; tf.GetFT(this); } } }
=============================================接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace InterfaceForm { public interface FormTitle { void GetFT(Form f); } }
=============================================插件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace IsOk { public class Class1:InterfaceForm.FormTitle { public void GetFT(Form f) { f.Text = "我是class1"; } } }
【若是須要源代碼,請給我留言】