北大青鸟光谷校区

北大青鸟光谷校区

  • 北大青鸟徐东校区
  • 北大青鸟光谷校区
  • 北大青鸟高新校区
  • 荆州青鸟之家
  • 襄阳青鸟之家

17740513250

百日千才

宿主插件模式-武汉北大青鸟IT培训学校java学员作品

发布日期: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路径!

        北大青鸟武汉宏鹏光谷校区的学员们无疑是相当的,希望他们能够在学习中掌握更多更广的技术,为就业打造坚实的基础。

关闭

只为了方便您就学 北大青鸟光谷校区 北大青鸟武汉校区

武汉市洪山区珞喻路724号(地铁二号线光谷广场站F口出

Copyright (c) 2006-2023 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.