发布日期:2023-03-31来源:武汉北大青鸟武汉校区作者:武汉宏鹏
这是武汉北大青鸟IT培训学校java学员的作品-宿主插件模式。
宿主插件模式
关于宿主插件模式,刚开始了解的时候,感觉很神奇,想自己学下!但网上找了资料,少的可怜,几乎没有!老师给了几个demo但就是不怎么懂!后来老师讲了下,也没什么神奇之处,就是接口和反射的一些应用!
学过java的都知道,我们只要导入一个jar文件,就可以用jar文件里面的东西,同样,我们先定义出一个接口,让其他的dll去实现,我在通过反射实现了我定义的接口的类就可以得到对象!
宿主插件模式,顾名思义,必须得有一个宿主,即一个平台,然后还得要有插件,为了插件能很好的加载到我提供的平台上,我还必须为平台开放一个接口,然后想要加载到平台的插件去实现即可!
先我们先来做一个平台并提供接口
一个应用程序窗体,一个类库,类库中定义了一个接口
IPlus
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace Host_InterFace
{
public interface IPlus
{
Control GetCon();
}
}
接口的目的是为了得到一个Control控件就行了!然后我们还要做的就是将插件加载进来,在form中我们要写加载事件
private const string PLUSPATH = "Plus";
private void tlPinPic_Click(object sender, EventArgs e)
{
//获?取¨?可¨¦执¡ä行D文?件t的Ì?路¡¤径? 去¨£¤掉Ì?执¡ä行D文?件t名?
string path = Application.ExecutablePath.Substring(0, Application.ExecutablePath.LastIndexOf(@"\"));
string[] plusfile = Directory.GetFiles(PLUSPATH, "*.dll");
//得Ì?到Ì?debug下?面?的Ì?Plus文?件t夹D下?的Ì?DLL文?件t
foreach (string filename in plusfile)
{
//拼¡ä出?完ª¨º整?的Ì?动¡¥态¬?库a文?件t
string fullFilePath = path + "\\"+filename;
Assembly asm = Assembly.LoadFile(fullFilePath);
Type[] types = asm.GetTypes();
foreach(Type type in types)
{
//如¨?果?存ä?在¨²实º¦Ì现?了¢?该?接¨®口¨²的Ì?dll就¨ª加¨®载?进?来¤¡ä
if (IsPlusInterfaceIn(type))
{
IPlus iplus = (IPlus)Activator.CreateInstance(type);
TabPage tp = new TabPage();
tp.Text = iplus.GetCon().Name;
tp.Controls.Add(iplus.GetCon());
this.tcShowIplus.TabPages.Add(tp);
}
}
}
}
private bool IsPlusInterfaceIn(Type type)
{
bool isExists = false;
Type[] interfaces = type.GetInterfaces();
foreach (Type tp in interfaces)
{
if(tp.Name=="IPlus")
{
isExists = true;
}
} return isExists;
}
上面代码的意思是我在做点击事件的时候 找到此(平台运行程序)程序的debug路径,然后找到里面Plus文件夹下面的所有DLL文件,然后找出里面实现了Iplus
接口的dll文件,然后通过反射得到Iplus对象,父类的对象指向子类的引用!这样就可以将实现接口的dll文件加载from中了!(当然要添加必要的引用)
上面是宿主的代码!下面我们来看下插件中的代码如果写
我们新建一个类库工程!
然后添加一个用户控件,然后去添加刚才的接口生成的dll引用,并且去实现Iplus接口
using Host_InterFace;
namespace Plus_Show
{
public partial class UCPlus_Show : UserControl,IPlus
{
#region IPlus 成¨¦员¡À
public Control GetCon()
{
return this;
}
#endregion
}
}
我们就是把我们添加的用户控件给返回给接口的实现!我们在用户控件上做的所有事件都可以被加载到平台上!
当然还有要注意的一点就是我在插件中要加载的资源文件,比如图片、声音等文件,不是相对于插件所在的路径了,而是宿主即平台运行的debug路径!
北大青鸟武汉宏鹏光谷校区的学员们无疑是相当的,希望他们能够在学习中掌握更多更广的技术,为就业打造坚实的基础。
Copyright (c) 2006-2023 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.