.net 插件化开发
之前在编程时发现很多地方调用时都会使用到dll文件,例如arcgis/mapwingis二次开发中,都会使用到相应的dll文件,实际使用的原理是,编译接口时产生dll文件,将该文件放置在主项目的引用中,使用时通过文件查询进行调用
主文件内容
namespace plugin_main_test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string path = Application.StartupPath + "\\plugin.dll";//获取exe文件运行的路径并与dll文件结合构造dll路径
Assembly asd = Assembly.LoadFile(path);//加载指定路径上的程序集文件的内容。
Type[] t = asd.GetTypes();//返回在此模块内定义的所有类,该文件包含一个接口实现show
//取出第一个类,实例化,实例化接口
plugin_test.inter i = (plugin_test.inter)System.Activator.CreateInstance(asd.GetType(t[0].FullName));
//通过接口调用
Text = i.show();
}
}
}
插件实现plugin
namespace plugin
{
public class Class1 : plugin_test.inter
{
public string show()
{
return "我是插件";
}
}
}
插件接口
namespace plugin_test
{
public interface inter
{
string show();
}
}
由代码可以看到,三套代码都位于不同的项目,在使用时,先将插件接口编译,得到dll(plguin_test)文件,在另外两个项目的引用中添加该dll(plugin_test)文件(引用-》添加引用-》浏览),只要添加了该dll(plguin_test)文件,则另外两个项目中可以使用plugin_test空间下的所有接口,eg(plugin_test.inter),这也是主文件能够使用plugin_test.inter i
的原因,同理,建立一个基于插件接口的类,实现该接口(show()),并编译,得到的dll(plugin)文件就实现了该接口,那么在主函数中得到该dll(plugin)文件后,能够加载到该dll(plugin)的类(Class1)i,并通过该类使用其下函数i.show();以上就实现了插件的建立和调用。
个人理解
明白接口原理后,将其用于开发便是com开发模式(插件开发),com不是新奇的技术,但其中依旧有很多值得学习的地方,mapwingis便是使用com开发模式的开源软件,有人将mwg4用c#重写并开源在github上,传送门runingriver/MapWinGIS,相信这是个不错的学习例子。
com开发模式避免了对系统内部功能的修改,在初始化系统后,一切的功能增减都靠插件来实现,在软件初始化过程中,查询对应插件库中是否有符合接口要求的插件,有就加载进来,并按原本规则划定一个显示或者触发插件的位置,点击插件后就是插件的功能使用了,也就能够实现软件的持续系统更新,而不必更新整个软件,在软件破解中也有不少使用dll插件破解的。