Mono addin 学习笔记 1
Mono Addin是一个开源的插件框架,其主要支持的特性如下:
The main features of Mono.Addins are:
- Supports descriptions of add-ins using custom attributes (for simple and common extensions) or using an xml manifest (for more complex extensibility needs).
- Support for add-in hierarchies, where add-ins may depend on other add-ins.
- Lazy loading of add-ins.
- Provides an API for accessing to add-in descriptions, which will allow building development and documentation tools for handling add-ins.
- Dynamic activation / deactivation of add-ins at run time.
- Allows sharing add-in registries between applications, and defining arbitrary add-in locations.
- Allows implementing extensible libraries.
- Supports add-in localization.
- In addition to the basic add-in engine, it provides a Setup library to be used by applications which want to offer basic add-in management features to users, such as enabling/disabling add-ins, or installing add-ins from on-line repositories.
(来自mono官方网站的解释,http://www.mono-project.com/Mono.Addins)
大概意思是:
1. 支持用自定义属性(Attribute,简单项目)和xml定义(大型项目);
2. 支持插件层次结构,允许插件之间相互依赖(插件本身可以定义扩展点供其他插件进行扩展)
3. 支持插件懒加载;
4. 提供了访问插件描述的API接口;
5. 支持运行期激活/关闭插件;
6. 主持在应用程序之间共享插件,也允许插件私有;
7. 支持可扩展的类库;
8. 本地化支持;
9. 除了提供插件引擎外,还提供了安装工具,用于提供安装/卸载插件、启用/禁用插件
下面分析用Attribute声明的方式来进行插件定义
定义扩展点如下:
[TypeExtensionPoint] //定义扩展点的属性
public interface ISnippetProvider
{
string GetText (string shortcut);
}
下面定义基于该扩展点的扩展如下:
[Extension] // 扩展点属性
class StockSnippetProvider: ISnippetProvider
{
public string GetText (string shortcut)
{
foreach (ExtensionNode<SnippetAttribute> node in AddinManager.GetExtensionNodes("/SnippetsAddinNode/StockSnippets"))
{
if (node.Data.Shortcut == shortcut)
return node.Data.Text;
}
return null;
}
}
//定义扩展属性如下:
[AttributeUsage (AttributeTargets.Assembly, AllowMultiple=true)]
public class SnippetAttribute : CustomExtensionAttribute
{
public SnippetAttribute ()
{ }
public SnippetAttribute ([NodeAttribute ("Shortcut")] string shortcut, [NodeAttribute ("Text")] string text)
{
Shortcut = shortcut;
Text = text;
}
[NodeAttribute]
public string Shortcut { get; set; }
[NodeAttribute]
public string Text { get; set; }
}
到目前位置,扩展点和扩展都已经定义好了,现在使用属性来生命扩展点,并定义几个扩展:
声明扩展点如下:
[assembly: ExtensionPoint("/SnippetsAddinNode/StockSnippets", ExtensionAttributeType = typeof(SnippetAttribute))]
声明扩展如下:
[assembly: Snippet("foreach", "foreach (var item in col)\n{\n\t<|>\n}")]
[assembly: Snippet("for", "for (int n=0; n<len; n++)\n{\n\t<|>\n}")]
[assembly: Snippet("c", "hello,world!")]
使用扩展点的代码如下:
foreach (ISnippetProvider provider in AddinManager.GetExtensionObjects <ISnippetProvider>())
{
string fullText = provider.GetText (word);
}
下一篇将分析用xml描述文件的方式来定义插件
Mono addin 学习笔记 1的更多相关文章
- Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)
1. Attribute声明方式 定义扩展属性 [AttributeUsage(AttributeTargets.Assembly, AllowMultiple= true)] public clas ...
- Mono addin 学习笔记 3
典型的基于Mono addin插件框架的应用程序有以下一个部分组成: 1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展: 2. 扩展插件: 其部署结构图如下为 ...
- Mono addin 学习笔记 2
下面分析用xml描述文件的方式来进行插件定义 定义扩展点如下: public interface ISnippetProvider { string GetText (string shortcut) ...
- Mono addin 学习笔记 5 TypeExtensionPoint
1. Attribute声明方式 定义扩展点: [TypeExtensionPoint]public interface ICommand{ void Run();} 定义扩展: [Ex ...
- NGUI 学习笔记实战之二——商城数据绑定(Ndata)
上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客 NGUI 学习笔记实战——制作商城UI界面 ht ...
- MVC_学习笔记_2_Authorize
MVC5_学习笔记_2_Authorize/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nico ...
- C#.NET学习笔记1---C#.NET简介
C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...
- VSTO学习笔记(十四)Excel数据透视表与PowerPivot
原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
随机推荐
- hdu 1047 (big integer sum, fgets or scanf, make you func return useful infos) 分类: hdoj 2015-06-18 08:21 39人阅读 评论(0) 收藏
errors made, boundary conditions, <= vs < , decreasing vs increasing , ++, –, '0'/'1' vs 0/1 p ...
- 验证页面多个input文本的必填项
前台页面 JS : function CheckMustWrite(){ var count = $("input[mustwrite = 'true']", document.f ...
- <input type="file">中怎设置那个按钮的样式
最近才开始学习HTML,在练习表单的过程中,发现在使用<input type="file"/>这个类型的元素,产生的文件框和浏览按扭,它们的样式往往不符合我们的需要.怎 ...
- ZeroMQ - 三种模型的python实现
ZeroMQ是一个消息队列网络库,实现网络常用技术封装.在C/S中实现了三种模式,这段时间用python简单实现了一下,感觉python虽然灵活.但是数据处理不如C++自由灵活. 1.Request- ...
- Win10/UWP新特性系列—电池报告
UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...
- 第三个Sprint冲刺第七天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:做最后的工作
- 用javascript判断一个html元素是否存在的五种方法:
1. 判断表单元素是否存在(一) if("periodPerMonth" in document.theForm){ return true; }else{ return fals ...
- CentOS6 下rsync服务器配置
一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...
- LintCode Binary Tree Preorder Traversal
Given a binary tree, return the preorder traversal of its nodes' values. Given: 1 / \ 2 3 / \ 4 5 re ...
- Python变量、数据类型6
1.Python变量 变量,即代表某个value的名字. 变量的值存储在内存中,这意味着在创建变量时会在内存中开辟一个空间. !!!即值并没有保存在变量中,它们保存在计算机内存的深处,被变量引用.所以 ...