Po wielu próbach z pozytywnym skutkiem udało mi się zrealizować taki sposób implementacji obsługi wtyczek, poniżej przykład testowy.
Program główny:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
string PlugFile = "";
Assembly As;
Object Ob;
MethodInfo Mstart;
MethodInfo Mrec;
MethodInfo Msnd;
// Uruchom
private void button1_Click(object sender, EventArgs e)
{
As = Assembly.LoadFile(PlugFile);
Type[] TT = As.GetTypes();
foreach (Type Tw in TT)
{
// Kanal - nazwa interfejsu
if (Tw.ToString().IndexOf(".TestDll") > (-1))
{
Ob = Activator.CreateInstance(Tw);
Mstart = Tw.GetMethod("Wystartuj");
Mrec = Tw.GetMethod("Pobierz");
Msnd = Tw.GetMethod("Wyswietl");
}
}
Mstart.Invoke(Ob, null);
}
// Wyslij
private void button2_Click(object sender, EventArgs e)
{
Object[] Params = new Object[1];
Params[0] = textBox1.Text;
Msnd.Invoke(Ob, Params);
}
// Pobierz
private void button3_Click(object sender, EventArgs e)
{
label1.Text = (string)(Mrec.Invoke(Ob, null));
}
private void button4_Click(object sender, EventArgs e)
{
OpenFileDialog Op = new OpenFileDialog();
if (Op.ShowDialog() == DialogResult.OK)
{
}
PlugFile = Op.FileName;
}
}
Wtyczka:
public class TestDll
{
Form1 Frm;
public void Wyswietl(string S)
{
Frm.label1.Text = S;
}
public string Pobierz()
{
return Frm.textBox1.Text;
}
public void Wystartuj()
{
Frm = new Form1();
Frm.Visible = true;
}
}
Wszysko ładnie gra. Z programu głównego mogę wywoływać metody zawarte we wtyczce, co umożliwia wprowadzanie danych do wtyczki, oraz wyciąganie tych danych na żądanie programu głównego.
Natomiast, czy da się zrobić metodę zawartą w programie głównym wywoływaną na żądanie wtyczki?
Na przykład w programie głównym jest metoda:
public void TestPlugin()
{
MessageBox.Show("Dziala");
}
A na formie wtyczki jest przycisk "Test", którego kliknięcie spowoduje uruchomienie powyższej metody z programu głównego.