查看: 1219|回复: 0
打印 上一主题 下一主题

利用unity来实现插件开发

[复制链接]

435

主题

2

听众

6371

积分

高级设计师

Rank: 6Rank: 6

纳金币
6372
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-9-12 11:12:37 |只看该作者 |倒序浏览
作者简单介绍自己的思路:
1、建一个IPlugin接口,每个插件都要继承这个接口。
2、建一个插件管理类,利用Unity来管理各个插件。
代码如下:
using System.Reflection;

using Microsoft.Practices.Unity;

public  interface IPlugin

{

void LoadPlugin();

string PluginName { get; }

}

public class PlugInManage

{

/// <summary>

/// 从dll***文件中获取继承IPluin接口的所有类的类型信息

/// </summary>

/// <param name="path">文件路径</param>

/// <returns>类型信息(插件名称,(插件类名称,插件所在程序集名称))</returns>

public static Dictionary<string, string> Load(string path)

{

if (!System.IO.Directory.Exists(path))

{

throw new System.IO.DirectoryNotFoundException();

}
Dictionary<string, string> pluins = new Dictionary<string,string>();

var files = System.IO.Directory.GetFiles(path);

foreach (var file in files)

{

if (file.ToLower().EndsWith("***") || file.ToLower().EndsWith(".dll"))

{

var assembly = Assembly.LoadFrom(file);

var types = assembly.GetTypes();

foreach (var type in types)

{
if (type.GetInterfaces().Count(c =>c == typeof(IPlugin)) > 0)

{
IPlugin instance = assembly.CreateInstance(type.FullName) as IPlugin;

if (instance != null)

{

_container.RegisterType(typeof(IPlugin), type, type.FullName, new ExternallyControlledLifetimeManager());
var name = string.IsNullOrEmpty(instance.PluginName) ?

type.FullName : instance.PluginName;

name = pluins.ContainsKey(name)?name+"_1":name;

pluins.Add(name, type.FullName);

}
}

}

}

}

return pluins;

}
static IUnityContainer _container = new UnityContainer();

public static IPlugin Resolve(string name)

{

GC.Collect();

return _container.Resolve<IPlugin>(name);

}
}

3、注意容器内注册的类型应为ExternallyControlledLifetimeManager类型的生命周期,外 部控制生命周期管理器,这个生命周期管理允许你使用RegisterType和RegisterInstance来注册对象之间的关系,但是其只会对对象 保留一个弱引用,其生命周期交由外部控制,也就是意味着你可以将这个对象缓存或者销毁而不用在意UnityContainer,而当其他地方没有强引用这 个对象时,其会被GC给销毁掉。在默认情况下,使用这个生命周期管理器,每次调用Resolve都会返回同一对象(单件实例),如果被GC回收后再次调用 Resolve方法将会重新创建新的对象。
测试如下:

using XZL.Plugin;

public partial class Form1 : Form

{

Dictionary<string, string> _plugins;

public Form1()

{

InitializeComponent();

this.Load += new EventHandler(Form1_Load);

this.button1.Click += new EventHandler(button1_Click);

}
void button1_Click(object sender, EventArgs e)

{

var p =  PlugInManage.Resolve(_plugins[listBox1.SelectedItem.ToString()]);

p.LoadPlugin();

//GC.Collect();
}
void Form1_Load(object sender, EventArgs e)

{

_plugins =  PlugInManage.Load(System.IO.Path.GetDirectoryName(Application.ExecutablePath)

+ "" + "plugins");

foreach (var item in _plugins)

{

listBox1.Items.Add(item.Key);

}

}

}


using XZL.Plugin;

public partial class Form1 : Form,IPlugin

{

public Form1()

{

InitializeComponent();

}
public void LoadPlugIn()

{

this.Show();

}
string IPlugin.PluginName

{

get { return this.Text; }

}

}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-4-29 23:24 , Processed in 0.081351 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部