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的更多相关文章

  1. Mono addin 学习笔记 4 再论数据扩展点(Data only extension point)

    1. Attribute声明方式 定义扩展属性 [AttributeUsage(AttributeTargets.Assembly, AllowMultiple= true)] public clas ...

  2. Mono addin 学习笔记 3

    典型的基于Mono addin插件框架的应用程序有以下一个部分组成: 1. 主应用程序:提供了一系列的扩展点(Extension Point)供其他应用进行扩展: 2. 扩展插件: 其部署结构图如下为 ...

  3. Mono addin 学习笔记 2

    下面分析用xml描述文件的方式来进行插件定义 定义扩展点如下: public interface ISnippetProvider { string GetText (string shortcut) ...

  4. Mono addin 学习笔记 5 TypeExtensionPoint

    1. Attribute声明方式 定义扩展点: [TypeExtensionPoint]public interface ICommand{        void Run();} 定义扩展: [Ex ...

  5. NGUI 学习笔记实战之二——商城数据绑定(Ndata)

    上次笔记实现了游戏商城的UI界面,没有实现动态数据绑定,所以是远远不够的.今天采用NData来做一个商城. 如果你之前没看过,可以参考上一篇博客   NGUI 学习笔记实战——制作商城UI界面  ht ...

  6. MVC_学习笔记_2_Authorize

    MVC5_学习笔记_2_Authorize/* GitHub stylesheet for MarkdownPad (http://markdownpad.com) *//* Author: Nico ...

  7. C#.NET学习笔记1---C#.NET简介

    C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...

  8. VSTO学习笔记(十四)Excel数据透视表与PowerPivot

    原文:VSTO学习笔记(十四)Excel数据透视表与PowerPivot 近期公司内部在做一种通用查询报表,方便人力资源分析.统计数据.由于之前公司系统中有一个类似的查询使用Excel数据透视表完成的 ...

  9. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

随机推荐

  1. UIView及其子类

    一.UI概述 UI(User Interface):用户界⾯,用户能看到的各种各样的⻚面元素. iOS App = 各种各样的UI控件 + 业务逻辑和算法 二.UIView 在手机上显示的内容都是UI ...

  2. Rhel6-torque作业调度系统配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.121 server21.example.com 计算节点 192.1 ...

  3. 微信JS-SDK DEMO页面和示例代码

    <?php require_once "jssdk.php"; $jssdk = new JSSDK("yourAppID", "yourApp ...

  4. android-Okhttp初步使用

    自从谷歌把android的请求框架换成Okhttp后,android开发人员对其的讨论就变的越来越火热,所有咱作为一枚吊丝android程序员,也不能太落后,所以拿来自己研究一下,虽然目前项目开发用的 ...

  5. mysql-5.6.17-win32免安装版配置

    下载mysql-5.6.17-win32:官网下载地址百度   解压到自定义目录,我这里演示的是D:\wamp\mysql\   复制根目录下的my-default.ini,改名为my.ini,my. ...

  6. BZOJ 4034 BIT & Dfs序

    调了恒久突然发现输出优化忘记带负号了.. 就是差分树状数组维护Dfs序即可. #include <iostream> #include <cstring> #include & ...

  7. 1、webservice的简单使用

    1.新建一个web端项目 2.点击添加项,选择web服务 3.在已经建好的项目中写一个方法 4.发布(发布方法选文件系统,web需要管理员权限) 生成文件夹: 5.配置IIS(略) 6.调用webse ...

  8. hadoop删除节点。

    hadoop节点摘除操作: 1.确定exclude文件的位置. <property> <name>dfs.hosts.exclude</name> <valu ...

  9. frame和bounds区别

    学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bound的 ...

  10. 练习2:雨淋湿了一道题,9个数字只能看清楚4个,第一个肯定不是1 [X * (Y3 + Z)]^2 = 8MN9,求出各个数字

    题目上的X代表的未知数,不一定是同一个数字. 其实这道题,直接一推敲答案就出来了,首先,积德尾数是9,说明 X*(Y3 + Z)的值尾数是3,3的因子只有1和3,所以X只有1和3候选,但是题目说第一个 ...