Skip to content

插件开发实例·C#

keepwn edited this page Nov 15, 2014 · 3 revisions
  1. 新建一个C#类库工程,命名为Test_DoNetPlugin。
  2. 添加引用Altman.Plugin.dllEto.dll,请不要引用System.Windows.Forms.dll
  3. 新建类PluginInfo.cs,继承于IPluginInfo,用于定义插件信息。
using System.Reflection;
using Altman.Plugin;
using Altman.Plugin.Interface;

namespace Test_DoNetPlugin
{
  public class PluginInfo : IPluginInfo
  {
      public string Name
      {
          get { return "DoNetPluginTest"; }
      }
      public string FileName
      {
          get { return Assembly.GetExecutingAssembly().ManifestModule.Name; }
      }
      public string Version
      {
          get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); }
      }
      public string Author
      {
          get { return "Keepwn"; }
      }
      public string Description
      {
          get { return "this is a .net plugin demo."; }
      }
  }
}
  1. 新建类PluginSetting.cs,继承于IPluginSetting,用于定义插件配置。其中:
  • IsAutoLoad 用于设置插件是否需要自动加载;
  • IndexInList 用于设置插件出现在Plugins菜单中的位置
  • LoadPath 用于设置插件装载点,默认为空,如果需要作为某个插件的子插件,则可以填写为父插件名。
using Altman.Plugin;
using Altman.Plugin.Interface;

namespace Test_DoNetPlugin
{
  public class PluginSetting : IPluginSetting
  {
      public bool IsAutoLoad
      {
          get { return false; }
      }

      public int IndexInList
      {
          get { return 1; }
      }

      public string LoadPath
      {
          get { return ""; }
      }
  }
}
  1. 新建类Plugin.cs,继承于IControlPlugin,用于实现插件接口。其中:
  • 如果继承于IControlPlugin,则创建控件类插件,插件将出现在标签页中
  • 如果继承于IFormPlugin,则创建窗体类插件,插件将以窗体形式出现
  • 类名前需要声明导出类型[Export(typeof(IPlugin))],声明这是一个IPlugin类型的插件
  • 同时还需要定义一个IHost类型的_host字段,同时声明[Import(typeof(IHost))],此字段可以调用由宿主框架提供的各种方法。(只有在插件构造函数初始化完毕后,此字段才会被实例化,也就是说在构造函数中无法使用这个字段)
  • Load() 用于插件初始化,由框架默认调用,当插件构造函数初始化完毕后,将自动调用该方法。经常用于插件的初始化操作,如果初始化正常,则返回true,默认为true
  • Show(PluginParameter data) 用于显示插件。参数类型为PluginParameter,返回类型为PanelForm
using System.ComponentModel.Composition;
using Altman.Plugin;
using Altman.Plugin.Interface;

namespace Test_DoNetPlugin
{
  [Export(typeof(IPlugin))]
  public class Plugin : IControlPlugin
  {
      private object _userControl;
      private PluginInfo _pluginInfo;
      private IPluginSetting _pluginSetting;

      [Import(typeof(IHost))]
      private IHost _host;
      public Plugin()
      {
          _pluginInfo = new PluginInfo();
          _pluginSetting = new PluginSetting();
      }

      public IPluginInfo PluginInfo
      {
          get { return _pluginInfo; }
      }

      public IPluginSetting PluginSetting
      {
          get { return _pluginSetting; }
      }

      public bool Load()
      {
          return true;
      }

      public object Show(PluginParameter data)
      {
          return _userControl = new DoNetPluginTest(_host, data);
      }

      public void Dispose()
      {
          _userControl = null;
      }
  }
}
  1. 新建类DoNetPluginTest.cs,继承于Panel,用于实现插件界面。
using System;
using System.Text;
using Altman.Plugin;
using Altman.Plugin.Interface;
using Eto.Drawing;
using Eto.Forms;

namespace Test_DoNetPlugin
{
  public class DoNetPluginTest : Panel
  {
      private TextBox _tbxMsg;
      private Button _btnShowMsgInStatus;
      private IHost _host;
      public DoNetPluginTest(IHost host, PluginParameter data)
      {
          _host = host;
          Init();
      }

      void Init()
      {
          _tbxMsg = new TextBox();
          _btnShowMsgInStatus = new Button {Text = "Show Msg In Status", Width = 150};
          _btnShowMsgInStatus.Click+=btn_showMsgInStatus_Click;

          var layout = new DynamicLayout {Padding = new Padding(10, 10), Size = new Size(10, 10)};
          layout.AddSeparateRow(new Label() { Text = "Msg", VerticalAlign = VerticalAlign.Middle }, _tbxMsg, null);
          layout.AddAutoSized(_btnShowMsgInStatus);
          layout.Add(null);

          this.Content = layout;
      }

      private void btn_showMsgInStatus_Click(object sender, EventArgs e)
      {
          _host.Ui.ShowMsgInStatusBar(_tbxMsg.Text);
      }
  }
}
  1. 编译程序为Test_DoNetPlugin.dll,将二进制文件保存在Plugins/Test_DoNetPlugin/Test_DoNetPlugin.dll,要求保存的目录与插件名同名。
  2. 运行主程序,即可在菜单Plugins中找到插件Test_DoNetPlugin

i am ready.

Clone this wiki locally