我遵循教程如何使应用程序支持插件。一切似乎都工作正常,但我需要插件能够在主应用程序中调用函数和访问变量,而不仅仅是其他方式。我有一个http包装类,将监测净使用情况等..主应用程序。该插件会从母应用程序调用http wrapper。C#插件:访问母表的形式和功能
我该如何做到这一点?我是否需要定义一个包含所有可用函数/变量的类?我还需要该插件来生成GUI,以便用户可以为其设置一些设置。
这是我走到这一步:
主要用途:
namespace MainApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<iPlugin> PLUGIN_LIST = new List<iPlugin>();
public void LoadPlugins()
{
// load plugins..
}
// how do I call this function from a plugin?!
public void HTTP()
{
// do some networking stuff..
}
private void Form1_Load(object sender, EventArgs e)
{
LoadPlugins();
}
}
}
插件接口:
namespace PluginInterface
{
public interface iPlugin
{
string GetPluginName();
void callHTTP();
void SerVar(string var);
}
}
插件:
namespace MyPlugin
{
public class Main : iPlugin
{
string variable = "";
public string GetPluginName()
{
return "MyPlugin";
}
public void callHTTP(){
MainApplication.HTTP(); // call HTTP in main application
}
public void SerVar(string var)
{
variable = var;
}
}
}
另外,当我按照教程,插件接口是一个单独的项目,我不得不'添加作为参考'在MainApplication和myPlugin。这是否意味着我的应用程序和插件依赖于pluginInterface.dll?还是只是开发需要?如果它们依赖于运行时,我怎样才能在我的应用程序和插件中定义它,以便我不必使用额外的dll?希望有道理,谢谢!
编辑:全MainApplication代码
public interface iPlugin
{
string GetPluginName();
string GetInformation();
void SerVar(string var);
}
namespace MainApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<iPlugin> PLUGIN_LIST = new List<iPlugin>();
public void LoadPlugins()
{
string path = Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
string pluginDir = Path.GetDirectoryName(path) + "\\Plugins";
foreach (string s in Directory.GetFiles(pluginDir, "*.dll"))
{
// THIS LINE GIVES THE ERROR
Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();
foreach (Type t in pluginTypes)
{
if (t.ToString().Contains("Main"))
{
iPlugin plugin = Activator.CreateInstance(t) as iPlugin;
PLUGIN_LIST.Add(plugin);
break;
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
LoadPlugins();
}
}
}
主应用程序项目中的插件接口会让我觉得更有意义。 –
感谢csm!我只想尽可能少地使用dll,因为应用程序本身将会是单个exe。当用户下载它时,应用程序将下载所有插件并将其保存在目录中。如果主应用程序依赖于pluginInterface.dll,那么它不会工作,我将需要使用另一个不依赖任何东西来完成所有工作的应用程序,我不想这样做。你能告诉我如何使用我提供的代码在主应用程序和插件中定义pluginInterface?谢谢! – user1015551
非常感谢,我现在就试试吧! – user1015551