我基于以下代码构建了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.";
}
}
}
答案 0 :(得分:0)
您已经完成了实例化插件的艰巨任务,现在您只需要在执行插件时传递控制器,就像这样:
plugin.PluginLaunched(controller);