WPF插件开发简单实现

最近做一个类似于qq游戏的东西,有好多游戏在里面,现在的要求是对于每一个游戏都要独立开发,也就是做成插件,做好一个游戏后直接把dll文件放过去就可以了。

这个东西做起来也不复杂,只需简单几步~~下面是项目的目录树
                            
下面对于几个关键点详述一下:
 
1. 首先要有一个统一的接口,供主程序和插件调用,在这里我建了一个Class Library项目(PlugInInterface),里面只放了一个接口IPlugIn.cs
publicinterface IPlugIn
{
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
}
}
 
 
3. 轮到主程序调用了
我会把插件项目的编译路径设为一个指定的文件夹,然后主程序去这里拿dll
 
DirectoryInfo d =new DirectoryInfo("./plugins/");
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暴露的所有公开类型
之后从公开类型里找到实现我们接口的类型 
 
代码
foreach (Type t in ts)
{
if (typeof(IPlugIn).IsAssignableFrom(t))
{
var ii
= ass.CreateInstance(t.FullName) as IPlugIn;
//这里还可以用Activitor创建实例Activator.CreateInstance(t) as IPlugIn;
//这样就不需要用之前加载的Assembly了~~编程可以更灵活一点
plugs.Add(ii);
}
}

 

 5. 把拿到的插件加入到主程序的页面
plugs.ForEach(ps =>
{
var com
= ps.LoadComponent();
this.LayoutRoot.Children.Add(com as FrameworkElement);
});
 
 欢迎讨论~~
 
 关于插件开发,使用MEF、Prism(MEF被整合到了Prism中~)的依赖注入容器会使这个过程更加简单~~
 
posted @ 2010-12-13 15:32  vvGO  阅读(3941)  评论(6编辑  收藏  举报