使用插件编辑用户界面

时间:2018-09-10 21:40:34

标签: c#

我基于以下代码构建了https://www.codeproject.com/Articles/1052356/Creating-a-Simple-Plugin-System-with-NET,并将其转换为Windows窗体。但是我不知道如何使它可以从DLL中编辑UI。我用以下代码创建了一个控制器类:

      public RichTextBox console;

        public void WriteToRichTextBox(dynamic text, RichTextBox control)
        {
            control.AppendText(text + "\n");
        }

`但是,我不知道如何使它们共享同一控制器类。

Form Code:

  PluginLoader loader;
        Controller controller;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                //Let the user fill in an plugin name

                string line = textBox1.Text;
                string name = line.Split(new char[] { ' ' }).FirstOrDefault();
                IPlugin plugin = PluginLoader.Plugins.Where(p => p._pluginName 
                == name).FirstOrDefault();
                if (plugin != null)
                {
                    //If the plugin is found, execute it
                    plugin.PluginLaunched();
                }
                else
                {
                    Log(string.Format("No plugin found with name '{0}'", name));
                }
            }
            catch (Exception ex)
            {
                Log(string.Format("Caught exception: {0}", ex.Message));
            }
            textBox1.Clear();
        }
        private void Log(string text)
        {
            richTextBox1.AppendText(text + "\n");
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            Log("Started plugin app..");
            try
            {
                loader = new PluginLoader();
                controller = new Controller();
                loader.LoadPlugins();
                controller.console = richTextBox1;
            }
            catch (Exception ex)
            {
                Log(string.Format("Plugins couldn't be loaded: {0}", 
    ex.Message));
            }

        }
Interface:

      public interface IPlugin
    {
        string _pluginName { get; }
        string _pluginDetails { get; }
        void PluginLaunched();
    }

Plugin:

     public class ListPlugins : IPlugin
    {
        public void PluginLaunched()
        {
            Controller _Controller = new Controller();
            foreach (IPlugin plugin in PluginLoader.Plugins)
            {
              _Controller.WriteToRichTextBox(string.Format("{0}: {1}", plugin._pluginName, plugin._pluginDetails), _Controller.console);
            }
        }

        public string _pluginName
        {
            get
            {
                return "listplugins";
            }
        }

        public string _pluginDetails
        {
            get
            {
                return "This plugin shows all loaded plugins and what they do.";
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您已经完成了实例化插件的艰巨任务,现在您只需要在执行插件时传递控制器,就像这样:

plugin.PluginLaunched(controller); 
相关问题