10 2012 档案
摘要:前面已经实现了插件的自动加载,调用者拿到插件实例后,如果要调用含有Action或者Func参数的方法时,需要思考"我这个回调应该在哪个域执行呢?"
. 仔细想想,貌似应该在哪个域里执行,应该在接口定义时定义好以避免混乱
阅读全文
摘要:前面我们已经实现了IPlugin接口的插件自动加载。 但是程序使用中,可以不仅仅只有一个接口,而可能是多个接口并存,不能每个接口都手动实现代码类!怎么办?
解决方案是:泛型+EMIT。 使用泛型把自动加载和插件接口分开,使用EMIT自动生成代理类。
阅读全文
摘要:前面已经得到了热插拔的插件原型,这次讨论如果插件是服务提供者怎么办?
我能想到的,
需要在起动时加载所有插件
然后在插件变动时,及时卸载旧的插件,加载新的插件。
如果有新插件放在目录中,需要马上加载新的插件。
如果插件被删除,我们要把对应的服务也移除。
最终使用时,如下:
private void FormMain_Load(object sender, EventArgs e)
{
var inst = PluginManager.Instance;
inst.PluginChanged += OnPluginChanged;
}
void OnPluginChanged(object sender, PluginManagerEventArgs e)
{
if (e.ChangeType == PluginChangeType.Created)
{
// 这里初始化插件,提供服务
e.PluginInstance.Run(DateTime.Now.To
阅读全文
摘要:看了空逸云的"基于AppDomain的"插件式"开发"后,在其基础上,做优化修改。
1. 使用AppDomain.CurrentDomain.AssemblyResolve ,在程序集找不到时,去plugins 目录中再次加载。这样就可以直接加载插件类名,方便多了。
2. 插件的方法有限,直接写上方法代理,去除了动态生成方法调用的性能损失。
阅读全文
摘要:虽说现在多数电脑都支持WIFI,但也有不支持的。 而现在安卓手机都带WIFI设备,于是抱着试试看的态度,让电脑通过手机的WIFI上网, 没有想到一举成功。
阅读全文