WPF插件开发简单实现
最近做一个类似于qq游戏的东西,有好多游戏在里面,现在的要求是对于每一个游戏都要独立开发,也就是做成插件,做好一个游戏后直接把dll文件放过去就可以了。
这个东西做起来也不复杂,只需简单几步~~下面是项目的目录树
下面对于几个关键点详述一下:
1. 首先要有一个统一的接口,供主程序和插件调用,在这里我建了一个Class Library项目(PlugInInterface),里面只放了一个接口IPlugIn.cs
publicinterface IPlugIn
{
object LoadComponent();
}
{
object LoadComponent();
}
2. 建一个插件项目WPF Usercontrol Library(MyPlugin)
代码
publicclass PlugInTest : IPlugIn
{
publicobject LoadComponent()
{
TextBlock t =new TextBlock();
t.Text ="hello, I am a plug in";
return t; //简单的返回一个TextBlock
}
}
{
publicobject LoadComponent()
{
TextBlock t =new TextBlock();
t.Text ="hello, I am a plug in";
return t; //简单的返回一个TextBlock
}
}
3. 轮到主程序调用了
我会把插件项目的编译路径设为一个指定的文件夹,然后主程序去这里拿dll
DirectoryInfo d =new DirectoryInfo("./plugins/");
List<IPlugIn> plugs =new List<IPlugIn>();
List<FileInfo> fs = d.GetFiles("*.dll").ToList<FileInfo>();
List<IPlugIn> plugs =new List<IPlugIn>();
List<FileInfo> fs = d.GetFiles("*.dll").ToList<FileInfo>();
4. 读到了dll之后就是加载和实例化了
Assembly ass = Assembly.LoadFrom(fi.FullName); //加载dll
Type[] ts = ass.GetExportedTypes(); //获得dll的assembly暴露的所有公开类型
Type[] ts = ass.GetExportedTypes(); //获得dll的assembly暴露的所有公开类型
代码
foreach (Type t in ts)
{
if (typeof(IPlugIn).IsAssignableFrom(t))
{
var ii = ass.CreateInstance(t.FullName) as IPlugIn;
{
if (typeof(IPlugIn).IsAssignableFrom(t))
{
var ii = ass.CreateInstance(t.FullName) as IPlugIn;
//这里还可以用Activitor创建实例Activator.CreateInstance(t) as IPlugIn;
//这样就不需要用之前加载的Assembly了~~编程可以更灵活一点
plugs.Add(ii);
}
}
plugs.Add(ii);
}
}
5. 把拿到的插件加入到主程序的页面
plugs.ForEach(ps =>
{
var com = ps.LoadComponent();
this.LayoutRoot.Children.Add(com as FrameworkElement);
});
{
var com = ps.LoadComponent();
this.LayoutRoot.Children.Add(com as FrameworkElement);
});
欢迎讨论~~
关于插件开发,使用MEF、Prism(MEF被整合到了Prism中~)的依赖注入容器会使这个过程更加简单~~