C# 动态加载插件的实现
来源:互联网 发布:ajax跨域php 编辑:程序博客网 时间:2024/05/22 05:05
花了半天时间,终于弄懂了C#如何现实动态加载插件的。就像photoshop一样只要在plugin里面丢几个dll就可以多一个滤镜。
总体思路必将简单
1.必须定义公共接口规范,说白点就是主程序在调用插件时会用到方法、属性、函数等等。有点类似于组织架构的岗位名称,岗位是固定的,任职要求(参数)也是固定的,只是人不一样而已。
实现方法:
新建一个类库
namespace MainPlug
{
public interface IMainPlug
{
void strat(string buttonname);
string F();
}
}
完了F5生产DLL
2.做插件,也很简单
新建一个类库,添加刚刚生成的DLL,本例为MainPlug.DLL
using System;
using System.Text;
using MainPlug;
using System.Windows.Forms;
namespace Plug1
{
public class myplug1 : Form, IMainPlug
{
public void strat(string buttonname)
{
Form f1 = new Form();
Button b1 = new Button();
b1.Text = buttonname;
f1.Controls.Add(b1);
b1.Top = 10;
b1.Left = 10;
f1.ShowDialog();
}
public string F()
{
return "this is F";
}
}
}
小窍门:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Reflection;
namespace plugTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ArrayList plugins = new ArrayList();
private void button1_Click(object sender, EventArgs e)
{
string[] files = Directory.GetFiles(Application.StartupPath + "\\plugins");
//将所有plugin文件夹下面的文件路径读取到files里面
foreach (string file in files)
{
if (file.ToUpper().EndsWith(".DLL"))//将文件名转换为大写,如果后缀为".DLL"则为插件,执行下面语句
{
Assembly ab = Assembly.LoadFile(file);//可以将assembly视为一个程序集的类型,通过loadfile将其实例化
Type[] types = ab.GetTypes();//获取程序集中程序的类型
foreach (Type t in types)
{
if (t.GetInterface("IMainPlug") != null)//搜索带有指定接口的插件
{
plugins.Add(ab.CreateInstance(t.FullName));//将插件装入plugins集合
listBox1.Items.Add(Full.Name );//在列表显示名字
}
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (listBox1.SelectedIndex == -1) return;//如果ListBox为空则返回
object selObj = this.plugins[listBox1.SelectedIndex];//将插件定义为一个对象
Type t = selObj.GetType();//获取插件的类型
MethodInfo Start = t.GetMethod("strat");//搜索指定方法,并将方法赋值给指定的实例
MethodInfo F = t.GetMethod("F");
Start.Invoke(selObj, new object[] { "按钮名字" });//实例化对象,new object[] {"按钮名字"}是参数集合
textBox1.Text = F.Invoke(selObj, null).ToString();//实例化对象
}
}
}
- C# 动态加载插件的实现
- spring+webwork的动态加载实现osgi的插件思想
- 【Android高级】DexClassloader和PathClassloader动态加载插件的实现
- c#实现动态加载Dll
- c#实现动态加载Dll
- c#实现动态加载Dll
- c#实现动态加载Dll
- c#实现动态加载Dll
- c#实现动态加载Dll
- C#中实现动态加载dll库
- 转载: c#实现动态加载Dll 收藏
- C#通过反射实现动态加载DLL
- 插件化的基石 -- apk动态加载
- 动态加载Silverlight应用的dll文件(可实现插件功能)
- 动态加载与插件系统的初步实现(二):AppDomain卸载与代理
- 动态加载与插件系统的初步实现(三):WinForm示例
- 动态加载与插件系统的初步实现(四):解析JSON、扩展Fiddler
- 如何实现携程动态加载插件中对aapt的改造
- C# keybd_event 用法及虚拟键值
- sendmessage 参数对应值C#(二)
- C# 注释规范
- Xcode官方文档安装路径和Xcode模拟器安装路径
- c# 全局热键
- C# 动态加载插件的实现
- CheckListBox的使用方法
- andriod 按钮事件 与 进度条事件
- Android实现对imageview的拖动以及缩放
- Asp.net C# 连接access 的办法
- ASP.NET打开新页面总结
- is—lm
- Asp.net中DetailsView中添加日历控件 及DropDownList 并实现数据同步更新
- 【转载】SQL Server 2008固定服务器/数据库角色