c# 反射與插件(插件的製做與應用 實現的流程)

=================插件實施與應用基本流程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";
}
}
}

 【若是須要源代碼,請給我留言】

相關文章
相關標籤/搜索