Skip to content
keepwn edited this page Nov 15, 2014 · 7 revisions

插件接口的定义

插件接口主要分两类:

如何实现插件接口

引用dll

  • C#版
    • 引用插件框架Altman.Plugin.dll
    • 引用UI框架Eto.dll
    • 移除对System.Windows.FormsSystem.Drawing的引用
    • 如果是创建.Net插件,推荐以类库模板方式创建
  • IronPython版
    • 导入clr模块,clr添加引用Altman.Plugin

      import clr
      clr.AddReference('Altman.Plugin')

实现插件

  • 插件需要实现IControlPlugin或者IControlPlugin接口
  • 插件需要申明[Import(typeof(IHost))][Export(typeof(IPlugin))]。以C#和IronPython为例:
    • C#

      [Export(typeof(IPlugin))]
      public class Plugin : IControlPlugin
      {
          [Import(typeof(IHost))]
          private IHost _host;
      
          // others...
      }
    • IronPython

      @export(IPlugin)
      class Plugin(IControlPlugin):
          @import_one(IHost)
          def import_host(self, host):
              self.host = host

插件之间如何交互

注册插件服务

  • 调用注册方法PluginServiceProvider.RegisterService,可以将插件的某些方法作为服务注册到全局插件服务中去。它们的调用方法如下:

    • PluginServiceProvider.RegisterService(string serviceName, string serviceTypeName, Func<PluginParameter, dynamic> func)
    • PluginServiceProvider.RegisterService(IPlugin provider, string serviceName, string serviceTypeName, Func<PluginParameter, dynamic> func)
    • provider表示此插件服务的提供者(可选),serviceName表示插件服务名,serviceTypeName表示此插件服务的分类,func为此插件服务的具体方法
  • 以C#和Iron为例:

  • C#

    public static string Base64_Encode(PluginParameter args)
    {
        var str = args[0];
        return Convert.ToBase64String(Encoding.Default.GetBytes(str));
    }
    PluginServiceProvider.RegisterService(plugin, "ToBase64", "Encode", Base64_Encode);
  • IronPython

    def hex_decode(args):
        return args[0].decode('hex')
    PluginServiceProvider.RegisterService("FromHex", "Decode", hex_decode)

调用插件服务

  • 调用查询方法PluginServiceProvider.GetService,可以获取指定插件服务并调用执行。它们的调用方法如下:

    • PluginServiceProvider.GetService(string serviceName)
    • serviceName表示插件服务名
  • 以C#为例:

    var base64 = PluginServiceProvider.GetService("ToBase64");
    var result = base64(new PluginParameter("str", "Test"));