我遵循教程如何使應用程序支持插件。一切似乎都工作正常,但我需要插件能夠在主應用程序中調用函數和訪問變量,而不僅僅是其他方式。我有一個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